Dashboard: hide No Creds msg while fetching projects & slices, display only if it...
[myslice.git] / portal / static / js / myslice.js
1 /*
2  * MySlice Class
3  */
4 function isFunction(functionToCheck) {
5  var getType = {};
6  return functionToCheck && getType.toString.call(functionToCheck) === '[object Function]';
7 }
8
9 function list() {
10         this.elements = [];
11 }
12
13 list.prototype.add = function(element) {
14         if (!this.has(element)) {
15                 this.elements.push(element);
16         }
17 };
18     
19 list.prototype.del = function(element) {
20         if (this.has(element)) {
21                 this.elements.splice(index, 1);
22         }
23 };
24     
25 list.prototype.has = function(element) {
26         index = $.inArray( element, this.elements );
27         if (index != -1) {
28                 return true;
29         }
30         return false;
31 };
32     
33 list.prototype.count = function() {
34     return this.elements.length;
35 };
36
37
38 /*
39  * resources, users, leases
40  */
41
42 function resources() {
43         this.pending = {
44                 toremove: new list(),
45                 toadd: new list(),
46         };
47 };
48
49 function leases() {
50         this.pending = {
51                 toremove: new list(),
52                 toadd: new list(),
53         };
54 };
55
56 function users() {
57         this.pending = {
58                 toremove: new list(),
59                 toadd: new list(),
60         };
61 };
62
63 /*
64  * Slice
65  */
66 function slice(name) {
67         this.name = name;
68         this.resources = new resources();
69         this.users = new users();
70         this.leases = new leases();
71         
72 };
73
74
75 /*
76  * User
77  */
78 function user(user) {
79         this.user = user;
80         this.testbeds = new list();
81         this.slices = new list();
82         
83         for (i = 0; i < this.user.slices.length; i++) {
84                 this.slices[this.user.slices[i]] = new slice(this.user.slices[i]);
85         }
86 };
87
88 user.prototype.slice = function(name) {
89         return this.slices[name];
90 };
91
92 user.prototype.list = function() {
93     for (s in this.slices) {
94     for (o in s) {
95       if (typeof o != 'function') {
96         console.log(o);
97       } else {
98         console.log("w "+o);
99       }
100       }
101     }
102 };
103
104 /*
105  * MySlice
106  */
107 var myslice = {
108         user: {},
109         
110         get_user: function() {
111                 if ($.isEmptyObject(this.user)) {
112                         //this.login(function() { return this.user; });
113             if(localStorage.getItem('user')!='undefined'){
114                             this.user = JSON.parse(localStorage.getItem('user'));
115             }else{
116                 return false;
117             }
118                 }
119                 return this.user;
120         },
121         projects: {},
122         
123         get_projects: function() {
124                 if ($.isEmptyObject(this.projects)) {
125                         //this.login(function() { return this.user; });
126             if(localStorage.getItem('projects')!='undefined'){
127                             this.projects = JSON.parse(localStorage.getItem('projects'));
128             }else{
129                 return false;
130             }
131                 }
132                 return this.projects;
133         },
134
135     loadSlices: function(slices) {
136         if (typeof(slices) == "undefined"){
137
138             if(myslice.user != null && typeof(myslice.user.slices) != "undefined" && myslice.user.slices.length>0){
139                 slices = myslice.user.slices
140             }
141         }
142         // myslice.user is in LocalStorage
143         if(typeof(slices) != "undefined"){
144             /*
145                 This allows progressive loading per AM platform
146                 Launch queries to get the resources and leases in Manifold Cache
147                 XXX platform:object
148                 TODO support cache for prefixed objects
149                 XXX Disabled until it's supported on Manifold side
150             */
151             /*
152             $.post("/rest/platform/", function( data ) {
153                 $.each(data, function(index, p) {
154                     $.post("/rest/"+p.platform+":resource/", function( data ) {
155                     });
156                     $.post("/rest/"+p.platform+":lease/", function( data ) {
157                     });
158                     $.each( slices, function(i, val) {
159                         // Launch a Query for each slice to get it in Manifold Cache
160                         $.post("/rest/"+p.platform+":slice/", { 'filters': { 'slice_hrn' : val } }, function(data) {
161                         });
162                     });
163
164                 });
165             });
166             */
167         }
168
169     },
170         login: function(fn) {
171         user = localStorage.getItem('user');
172         if($.isEmptyObject(user)){
173             // REGISTRY ONLY TO BE REMOVED WITH MANIFOLD-V2
174                     $.post("/rest/myslice:user/",{'filters':{'user_hrn':'$user_hrn'}}, function( data ) {
175                         if (data.length > 0) {
176                             localStorage.setItem('user', JSON.stringify(data[0]));
177                     projects = [];
178                             $.each(data[0].pi_authorities, function(idx, auth) {
179                         // PI on projects
180                         if(auth.split('.').length>2){
181                             if($.inArray(auth,projects) == -1){
182                                 projects.push(auth);
183                             }
184                         }else if (auth.split('.').length>1){
185                         // PI on authorities
186                             // What are the projects under this authority?
187                             $.post("/rest/myslice:authority/",{'fields':['authority_hrn'],'filters':{'authority_hrn':'CONTAINS'+auth}}, function( data ) {
188                                         $.each(data, function(idx, project) {
189                                     if($.inArray(project.authority_hrn,projects) == -1){
190                                         projects.push(project.authority_hrn);
191                                     }
192                                 });
193                             });
194                         }else{
195                             console.log("admin account - we don't list all from root");
196                         }
197                     });
198                     localStorage.setItem('projects', JSON.stringify(projects));
199                     myslice.loadSlices(data[0].slices);
200                     if(isFunction(fn)){
201                         fn();
202                     }
203                 }else{
204                     $('#credentials_msg').css('display','block');
205                 }
206                     });
207         }else{
208             $('#credentials_msg').css('display','block');
209             if(isFunction(fn)){
210                 fn();
211             }
212         }
213         },
214
215
216     getSlices: function(name) {
217         
218     },
219     
220     refreshUser: function() {
221         
222     },
223     
224     apply: function() {
225
226         //$('div#loading').show();
227         //this.pending = [];
228         //this.save();
229         //setTimeout(function(){
230                 //$('div#loading').hide();
231                 //window.location.href = '/resources/' + this.slice + '?message=true';
232                 //},6000);
233         
234          
235
236          $.post("/rest/slice/", { 'fields': ['resource','slice_hrn'], 'filters': { 'slice_hrn' : this.slice  } }, function(data) {
237                  console.log(data);
238                  resources = [];
239                  reserved = [];
240                  update = [];
241                  if ('resource' in data[0]) {
242                          $.each(data[0].resource, function(idx, r) {
243                                  resources.push(r.urn);
244                          });
245                  }
246                  //myslice.pending
247                  console.log(myslice.pending);
248                  console.log(resources);
249                  $.each(resources.concat(myslice.pending), function(idx, v) {
250                          update.push( v );
251                  });
252                  console.log(update);
253                  $.post("/update/slice/", { 'filters': { 'slice_hrn' : myslice.slice  }, 'params' : update }, function(data) {
254                          console.log(data);
255                  });
256          });
257         console.log(this.slice);
258     }
259     
260 };
261
262
263 /* MySlice Init */
264
265 // var Reflector = function(obj) {
266   // this.getProperties = function() {
267     // var properties = [];
268     // for (var prop in obj) {
269       // if (typeof obj[prop] != 'function') {
270         // properties.push(prop);
271         // console.log("prop: " + prop);
272       // } else {
273         // console.log("func: " + prop);
274       // }
275     // }
276     // return properties;
277   // };
278 // };
279 // var reflector = new Reflector(myslice.slices[0].resources.pending);
280 // reflector.getProperties();
281
282
283 $(document).ready(function() {
284         //console.log(myslice.user().slices);
285         
286         // $.post("/rest/user/",{'filters':{'user_hrn':'$user_hrn'}}, function(data) {
287                 // myslice.user = new user(data[0]);
288                 // console.log(myslice.user.slices);
289                 // myslice.user.list();
290 //        
291         // }).fail(function() {
292                 // throw "error retreiving user data";
293         // });
294         // Put the object into storage
295         //localStorage.setItem('testObject', JSON.stringify(testObject));
296
297         // Retrieve the object from storage
298         //myslice.load();
299
300 });
301
302 /* EXEMPLES */
303 // add a resource to pending
304
305 //myslice.user.slice('ple.upmc.myslicedemo').resources.pending.add(resource);
306