11bc0882e1f184df067fe651fe1b14506f9e224b
[groupbasedpolicy.git] / groupbasedpolicy-ui / module / src / main / resources / gbp / gbp.services.js
1 define(['app/gbp/gbp.module', 'app/gbp/js/joint.clean.build'], function(gbp, joint) {\r
2 \r
3     gbp.register.factory('GBPRestangular', function(Restangular, ENV) {\r
4         return Restangular.withConfig(function(RestangularConfig) {\r
5             RestangularConfig.setBaseUrl(ENV.getBaseURL("MD_SAL"));\r
6         });\r
7     });\r
8 \r
9     gbp.register.factory('GBPConstants', function() {\r
10         var c = { colors: {'graph' : {}}, strings: {}, jointElements: {}, objType: {}, numbers: {}};\r
11 \r
12         c.strings.flood = 'flood';\r
13         c.strings.bridge = 'bridge';\r
14         c.strings.l3ctx = 'l3ctx';\r
15         c.strings.subnet = 'subnet';\r
16 \r
17         c.strings.config = 'CONFIG';\r
18         c.strings.oper = 'OPERATIONAL';\r
19         c.strings.l2l3 = 'L2L3';\r
20         c.strings.mock = 'MOCK';\r
21         c.strings.sigmaTopoDefaultText = 'SIGMATOPODEFAULTTEXT';\r
22         c.strings.sigmaTopoDefault = 'SIGMATOPODEFAULTTEXT';\r
23 \r
24         c.colors[c.strings.flood] = '#DF0101';\r
25         c.colors[c.strings.bridge] = '#0080FF';\r
26         c.colors[c.strings.l3ctx] = '#3ADF00';\r
27         c.colors[c.strings.subnet] = '#FF9933';\r
28         c.colors[c.strings.sigmaTopoDefaultText] = '#fff';\r
29 \r
30         c.colors[c.strings.flood+'-'+c.strings.bridge] = '#6666FF';\r
31         c.colors[c.strings.bridge+'-'+c.strings.l3ctx] = '#6666FF';\r
32 \r
33         c.colors[c.strings.subnet+'-'] = '#6666FF';\r
34 \r
35         c.colors['graph']['subject'] = '#FFFFD4';\r
36         c.colors['graph']['cns'] = '#8EEDFF';\r
37         c.colors['graph']['pns'] = '#FF9C9C';\r
38 \r
39         c.jointElements.minWidth = 100;\r
40         c.jointElements.maxWidth = 300;\r
41         c.jointElements.minHeight = 50;\r
42         c.jointElements.maxHeight = 300;\r
43 \r
44         c.objType.contract = 'contract';\r
45         c.objType.epg = 'epg';\r
46         c.objType.consumer = 'consumer';\r
47         c.objType.provider = 'provider';\r
48         c.objType.subject = 'subject';\r
49         c.objType.rule = 'rule';\r
50 \r
51         c.numbers.displayLabelLength = 40;\r
52 \r
53         return c;\r
54     });\r
55 \r
56     gbp.register.factory('MockServices', function() {\r
57 \r
58         var ms = {};\r
59 \r
60         ms.mockTopoData = function() {\r
61             var lid = 0,\r
62                 nodeRaw = [0, 1, 2, 3],\r
63                 linkRaw = [[0, 1], [2, 3], [3, 0], [0, 3]],\r
64                 nodes = nodeRaw.map(function(data) {\r
65                     return {\r
66                                 'id': 'n' + data,\r
67                                 'label': 'LABEL'+data,\r
68                                 'size': 3,\r
69                                 'x': Math.random(),\r
70                                 'y': Math.random(),\r
71                                 'color': GBPConstants.colors[GBPConstants.strings.sigmaTopoDefault]\r
72                             };\r
73                 }),\r
74                 links = linkRaw.map(function(data) {\r
75                     var obj = {\r
76                                 id: 'e' + lid,\r
77                                 source: 'n' + data[0],\r
78                                 target: 'n' + data[1],\r
79                                 color: GBPConstants.colors[GBPConstants.strings.sigmaTopoDefault]\r
80                             };\r
81                     lid = lid + 1;\r
82                     return obj;\r
83                 });\r
84 \r
85             return {nodes: nodes, links: links};\r
86         };\r
87 \r
88         return ms;\r
89     });\r
90 \r
91     gbp.register.factory('TopologyDataLoaders', function(GBPRestangular, GBPConstants) {\r
92         var tdl = {};\r
93 \r
94         tdl.getSubjectsBetweenEndpointGroups = function(storage, tenantId, successCbk, errorCbk) {\r
95             var restObj = GBPRestangular.one('restconf').one('operations'),\r
96                 rpcRes = 'ui-backend:get-subjects-between-endpoint-groups',\r
97                 reqData = { "input": { "tenant-id": tenantId }};\r
98 \r
99             if(storage) {\r
100                 reqData.input['from-oper-data'] = {};\r
101             }\r
102 \r
103             restObj.post(rpcRes, reqData).then(function(data) {\r
104                 // console.info('got data', data.output);\r
105                 successCbk(data);\r
106             }, function(res) {\r
107                 errorCbk(res);\r
108             });\r
109         };\r
110 \r
111         //Policies are representing links in PGN topology\r
112         tdl.getGroupRulesBetweenEndpointGroups = function(successCbk, errorCbk) {\r
113             var restObj = GBPRestangular.one('restconf').one('operations'),\r
114                 rpcRes = 'pgn-application:get-group-rules-between-endpoint-groups',\r
115                 reqData = { "input": { "endpoint-group-pair":[] }};\r
116 \r
117             restObj.post(rpcRes, reqData).then(function(data) {\r
118                 successCbk(data); //set topology links\r
119             }, function(res) {\r
120                 errorCbk(res);\r
121             });\r
122         };\r
123 \r
124         //Groups are representing nodes in PGN topology\r
125         tdl.getEndpointGroups = function(successCbk, errorCbk) {\r
126             var tenantId = getId(idTypes.tenant),\r
127                 restObj = GBPRestangular.one('restconf').one('operations'),\r
128                 rpcRes = 'pgn-application:get-endpoint-groups',\r
129                 reqData = {\r
130                             "input": {\r
131                                 "endpoint-group-id":[\r
132                                     {\r
133                                         "pgn-application:tenant-id": tenantId\r
134                                     }\r
135                                 ]\r
136                             }\r
137                         };\r
138 \r
139           restObj.post(rpcRes, reqData).then(function(data) {\r
140               successCbk(data); //set topology nodes\r
141           }, function(res) {\r
142               errorCbk(res);\r
143           });\r
144 \r
145         };\r
146 \r
147         tdl.getEndpointsFromEndpointGroup = function(tenantId, epgId, successCbk, errorCbk) {\r
148             var restObj = GBPRestangular.one('restconf').one('operations'),\r
149                 rpcRes = 'ui-backend:get-endpoints-from-endpoint-group',\r
150                 reqData = {\r
151                             "input": {\r
152                                 "tenant-id": tenantId,\r
153                                 "endpoint-group-id":epgId\r
154                             }\r
155                         };\r
156 \r
157           restObj.post(rpcRes, reqData).then(function(data) {\r
158               successCbk(data); //set topology nodes\r
159           }, function(res) {\r
160               errorCbk(res);\r
161           });\r
162 \r
163         };\r
164 \r
165         tdl.getEpgTopo = function(data){\r
166             var epgData = data.output['endpoint-group-pair-with-subject'],\r
167                 nodes = [],\r
168                 edges = [],\r
169                 setNode = function(obj){\r
170                     var nodeObj = {\r
171                             'id': 'n' + nodes.length,\r
172                             'label': obj.name || obj.id,\r
173                             'name': obj.name,\r
174                             'size': 1,\r
175                             'x': Math.random(),\r
176                             'y': Math.random(),\r
177                             'color': GBPConstants.colors[GBPConstants.strings.sigmaTopoDefault]\r
178                         };\r
179 \r
180                     nodes.push(nodeObj);\r
181                     return nodeObj.id;\r
182                 },\r
183                 setEdge = function(sourceId, destId, data) {\r
184                     var obj = {\r
185                             'id': 'e' + edges.length,\r
186                             'source': sourceId,\r
187                             'target': destId,\r
188                             'color': GBPConstants.colors[GBPConstants.strings.sigmaTopoDefault],\r
189                             'data': data\r
190                             // 'type': 'curve',\r
191                             // 'size' : 100\r
192                         };\r
193 \r
194                     edges.push(obj);\r
195                 },\r
196                 getObjByProp = function(val, prop, list) {\r
197                     return list.filter(function(i){\r
198                         return i[prop] === val;\r
199                     });\r
200                 };\r
201 \r
202             if(epgData) {\r
203                 epgData.forEach(function(e){\r
204                     var cepgnId = null,\r
205                         pepgnId = null;\r
206 \r
207                     if ( !getObjByProp(e['consumer-endpoint-group-id'],'name', nodes).length ) {\r
208                         var objCepg = {\r
209                             type: 'epg',\r
210                             name: e['consumer-endpoint-group-id']\r
211                         };\r
212                         cepgnId = setNode(objCepg);\r
213                     } else {\r
214                         cepgnId = getObjByProp(e['consumer-endpoint-group-id'],'name', nodes)[0].id;\r
215                     }\r
216                     if ( !getObjByProp(e['provider-endpoint-group-id'],'name', nodes).length ) {\r
217                         var objPepg = {\r
218                             type: 'epg',\r
219                             name: e['provider-endpoint-group-id']\r
220                         };\r
221                         pepgnId = setNode(objPepg);\r
222                     } else {\r
223                         pepgnId = getObjByProp(e['provider-endpoint-group-id'],'name', nodes)[0].id;\r
224                     }\r
225                     if ( cepgnId && pepgnId ) {\r
226                         setEdge(cepgnId, pepgnId, e['ui-subject']);\r
227                     }\r
228                 });\r
229             }\r
230 \r
231             return {\r
232                 nodes: nodes,\r
233                 links: edges\r
234             };\r
235         };\r
236 \r
237         \r
238         tdl.getL2L3 = function(storage, tenantId, successCbk, errorCbk) {\r
239             //l2-bridge-domain\r
240             var lid = 0,\r
241                 nid = 0,\r
242                 getL2L3Label = function(node) {\r
243                     return node.name || node.id;\r
244                 },\r
245                 getSubnetLabel = function(node) {\r
246                     return node['ip-prefix'] || node.id;\r
247                 },\r
248                 getNodeColor = function(src) {\r
249                     return GBPConstants.colors[src] || GBPConstants.colors[GBPConstants.strings.sigmaTopoDefault];\r
250                 },\r
251                 getLinkColor = function(from, to) {\r
252                     return GBPConstants.colors[from+'-'+to] || GBPConstants.colors[GBPConstants.strings.sigmaTopoDefault];\r
253                 },\r
254                 getNodes = function(data, srcDesc, getLabelCbk) {\r
255                     var nodes = data.map(function(elem) {\r
256                         var obj = {\r
257                             'id': 'n' + nid,\r
258                             'label': getLabelCbk(elem),\r
259                             'uuid': elem.id,\r
260                             'size': 3,\r
261                             'x': Math.random(),\r
262                             'y': Math.random(),\r
263                             'color': getNodeColor(srcDesc)\r
264                         };\r
265 \r
266                         nid += 1;\r
267                         return obj;\r
268                     });\r
269 \r
270                     return nodes;\r
271                 },\r
272                 getLinks = function(data, srcNodes, targetNodes, fromDesc, toDesc) {\r
273                     var findByUUID = function(array, uuid) {\r
274                         return array.filter(function(elem) {\r
275                             return elem.uuid === uuid;\r
276                         })[0];\r
277                     };\r
278 \r
279                     var links = data.map(function(elem) {\r
280                         var obj = null,\r
281                             src = findByUUID(srcNodes, elem.id),\r
282                             trg = findByUUID(targetNodes, elem.parent);\r
283 \r
284                         if(src && trg) {\r
285                             obj = {\r
286                                 'id': 'e' + lid,\r
287                                 'source': src.id,\r
288                                 'target': trg.id,\r
289                                 'color': getLinkColor(fromDesc, toDesc)\r
290                             };\r
291                             lid += 1;\r
292                         }\r
293 \r
294                         return obj;\r
295                     }).filter(function(elem) {\r
296                         return elem !== null;\r
297                     });\r
298 \r
299                     return links;\r
300                 };\r
301 \r
302             restObj = GBPRestangular.one('restconf').one(storage).one('policy:tenants').one('tenant').one(tenantId);\r
303 \r
304             restObj.get().then(function(data) {\r
305                 var l2FloodNodes = getNodes(data.tenant[0]['l2-flood-domain'] || [], GBPConstants.strings.flood, getL2L3Label),\r
306                     l2BridgeNodes = getNodes(data.tenant[0]['l2-bridge-domain'] || [], GBPConstants.strings.bridge, getL2L3Label),\r
307                     l3ContextNodes = getNodes(data.tenant[0]['l3-context'] || [], GBPConstants.strings.l3ctx, getL2L3Label),\r
308                     subnetNodes = getNodes(data.tenant[0]['subnet'] || [], GBPConstants.strings.subnet, getSubnetLabel),\r
309                     l2FloodLinks = getLinks(data.tenant[0]['l2-flood-domain'] || [], l2FloodNodes, l2BridgeNodes, GBPConstants.strings.flood, GBPConstants.strings.bridge),\r
310                     l2BridgeLinks = getLinks(data.tenant[0]['l2-bridge-domain'] || [], l2BridgeNodes, l3ContextNodes, GBPConstants.strings.bridge, GBPConstants.strings.l3ctx),\r
311                     subnetLinks = getLinks(data.tenant[0]['subnet'] || [], subnetNodes, l2BridgeNodes.concat(l2FloodNodes).concat(l3ContextNodes), GBPConstants.strings.subnet, ''),\r
312                     allNodes = l2BridgeNodes.concat(l2FloodNodes).concat(l3ContextNodes).concat(subnetNodes),\r
313                     allLinks = l2BridgeLinks.concat(l2FloodLinks).concat(subnetLinks);\r
314 \r
315                 successCbk(allNodes, allLinks);\r
316             }, function(res) {\r
317                 errorCbk(res.data, res.status);\r
318             });\r
319         };\r
320 \r
321         tdl.getClassifierInstances = function() {\r
322 \r
323         };\r
324 \r
325         return tdl;\r
326     });\r
327 \r
328     gbp.register.factory('TopoServices', function(TopologyDataLoaders, MockServices, GBPConstants) {\r
329 \r
330         var ts = {};\r
331 \r
332         var loaders = {};\r
333 \r
334         var legends = {};\r
335 \r
336         var transformPGNTopoNodes = function(data) {\r
337             return data.output['endpoint-group'].map(function(d) {\r
338                 return {\r
339                     id: d.id,\r
340                     group: d.name,\r
341                     sgt: d['security-group-tag']\r
342                 };\r
343             });\r
344         };\r
345 \r
346         var transformPGNTopoLinks = function(data) {\r
347             return data.output['endpoint-group-pair-with-rules'].map(function(d) {\r
348                 return {\r
349                     source: d['provider-group-id'],\r
350                     target: d['consumer-group-id'],\r
351                     policy: d['group-rule'][0]['action-ref'].map(function(r) {\r
352                         return r.name;\r
353                     })\r
354                 };\r
355             });\r
356         };\r
357 \r
358         var gbpLegend = {\r
359             'epg' : GBPConstants.colors[GBPConstants.strings.sigmaTopoDefault]\r
360         };\r
361 \r
362         legends[GBPConstants.strings.empty] = {};\r
363         legends[GBPConstants.strings.config] = gbpLegend;\r
364         legends[GBPConstants.strings.oper] = gbpLegend;\r
365         legends[GBPConstants.strings.mock] = gbpLegend;\r
366         legends[GBPConstants.strings.l2l3] = {\r
367             'l2-flood': GBPConstants.colors[GBPConstants.strings.flood],\r
368             'l2-bridge': GBPConstants.colors[GBPConstants.strings.bridge],\r
369             'l3-context': GBPConstants.colors[GBPConstants.strings.l3ctx],\r
370             'subnet': GBPConstants.colors[GBPConstants.strings.subnet],\r
371             'link': GBPConstants.colors[GBPConstants.strings.subnet+'-']\r
372         };\r
373 \r
374         loaders[GBPConstants.strings.empty] = function(successCbk, errorCbk) {\r
375             successCbk([], []);\r
376         };\r
377 \r
378         loaders[GBPConstants.strings.config] = function(successCbk, errorCbk, args) {\r
379             var storage = args.storage || 'config',\r
380                 tenantId = args.tenantId;\r
381                 \r
382        \r
383             TopologyDataLoaders.getSubjectsBetweenEndpointGroups(false, tenantId, function(data){\r
384                 var topo = TopologyDataLoaders.getEpgTopo(data);\r
385                 successCbk(topo.nodes, topo.links);\r
386                 //successCbk\r
387             }, errorCbk);\r
388         };\r
389 \r
390         loaders[GBPConstants.strings.oper] = function(successCbk, errorCbk, args) {\r
391             var storage = args.storage || 'config',\r
392                 tenantId = args.tenantId;\r
393 \r
394             TopologyDataLoaders.getSubjectsBetweenEndpointGroups(true, tenantId, function(data){\r
395                 var topo = TopologyDataLoaders.getEpgTopo(data);\r
396                 successCbk(topo.nodes, topo.links);\r
397                 //successCbk\r
398             }, errorCbk);\r
399         };\r
400 \r
401         loaders[GBPConstants.strings.l2l3] = function(successCbk, errorCbk, args) {\r
402             var storage = args.storage || 'config',\r
403                 tenantId = args.tenantId;\r
404 \r
405             if(storage && tenantId) {\r
406                 TopologyDataLoaders.getL2L3(storage, tenantId, successCbk, errorCbk);\r
407             } else {\r
408                 //different kind of error\r
409                 errorCbk();\r
410             }\r
411         };\r
412 \r
413         loaders[GBPConstants.strings.mock] = function(successCbk, errorCbk) {\r
414             var data = MockServices.mockTopoData();\r
415             successCbk(data.nodes, data.links);\r
416         };\r
417 \r
418         ts.getConsProvLabel = function(edge, topo){\r
419             var provName = '',\r
420                 conName = '';\r
421 \r
422             topo.nodes.forEach(function(n){\r
423 \r
424                 if ( edge.source === n.id ) {\r
425                     provName = n.name;\r
426                 }\r
427 \r
428                 if ( edge.target === n.id ) {\r
429                     conName = n.name;\r
430                 }\r
431             });\r
432 \r
433             return provName + ':' + conName;\r
434         };\r
435 \r
436         ts.getLegend = function(type) {\r
437             if(type === null || legends.hasOwnProperty(type) === false) {\r
438                 type = GBPConstants.strings.empty;\r
439             }\r
440 \r
441             return legends[type];\r
442         };\r
443 \r
444         ts.loadTopology = function(type, successCbk, errorCbk, args) {\r
445             if(type === null || loaders.hasOwnProperty(type) === false) {\r
446                 type = GBPConstants.strings.empty;\r
447             }\r
448 \r
449             loaders[type](successCbk, errorCbk, args);\r
450         };\r
451 \r
452         return ts;\r
453     });\r
454 \r
455     gbp.register.factory('GPBServices', function(GBPRestangular) {\r
456 \r
457         var s = {};\r
458 \r
459         s.getDefinitions = function(successCbk, errorCbk) {\r
460             var restObj = GBPRestangular.one('restconf').one('operational').one('policy:subject-feature-definitions');\r
461 \r
462             restObj.get().then(function(data) {\r
463                 if(data['subject-feature-definitions']) {\r
464                     var classifiersDefs = data['subject-feature-definitions']['classifier-definition'] || [],\r
465                         actionsDefs = data['subject-feature-definitions']['action-definition'] || [];\r
466                         successCbk(classifiersDefs, actionsDefs);\r
467                 } else {\r
468                     //TODO log error\r
469                 }\r
470             }, function(res) {\r
471                 // errorCbk(res);\r
472             });\r
473         };\r
474 \r
475         s.getUUIDnumber = function() {\r
476             var d = new Date().getTime();\r
477             return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {\r
478                         var r = (d + Math.random()*16)%16 | 0;\r
479                         d = Math.floor(d/16);\r
480                         return (c=='x' ? r : (r&0x3|0x8)).toString(16);\r
481                     });\r
482         };\r
483 \r
484         s.createRestObj = function(storage) {\r
485             storage = storage || 'config';\r
486             restObj = GBPRestangular.one('restconf').one(storage);\r
487 \r
488             return restObj;\r
489         };\r
490 \r
491         s.send = function(restObj, reqData, successCbk, errorCbk) {\r
492             restObj.customPUT(reqData).then(function(data) {\r
493                 successCbk(data);\r
494             }, function(res) {\r
495                 errorCbk(res.data, res.status);\r
496             });\r
497         };\r
498 \r
499         s.post = function(restObj, reqData, successCbk, errorCbk) {\r
500             restObj.customPOST(reqData).then(function(data) {\r
501                 successCbk(data);\r
502             }, function(res) {\r
503                 errorCbk(res.data, res.status);\r
504             });\r
505         };\r
506 \r
507         s.delete = function(restObj, successCbk, errorCbk) {\r
508             restObj.remove().then(function(data) {\r
509                 successCbk(data);\r
510             }, function(res) {\r
511                 errorCbk(res.data, res.status);\r
512             });\r
513         };\r
514 \r
515         s.load = function(restObj, transformCallback, successCbk, errorCbk) {\r
516             restObj.get().then(function(data) {\r
517                 var objs = transformCallback(data) || [];\r
518                 successCbk(objs);\r
519             }, function(res) {\r
520                 errorCbk(res.data, res.status);\r
521             });\r
522         };\r
523 \r
524         s.stripNullValues = function(obj) {\r
525             Object.keys(obj).forEach(function(k) {\r
526                 if(obj[k] === null) {\r
527                     delete obj[k];\r
528                 }\r
529             });\r
530 \r
531             return obj;\r
532         };\r
533 \r
534         s.removeEmptyElementsFromList = function(list) {\r
535             return list.filter(function(e) {\r
536                 return e !== "";\r
537             });\r
538         };\r
539 \r
540         s.createParamObj = function(name, type, value) {\r
541             var obj = { name: name };\r
542 \r
543             obj[type+'-value'] = value;\r
544 \r
545             return obj;\r
546         };\r
547 \r
548         s.getInstanceParamValue = function(param) {\r
549             return param['int-value'] || param['string-value'] || param['range-value'];\r
550         };\r
551 \r
552         s.getDefinitionObjParams = function(defObj, id) {\r
553             var obj = defObj.filter(function(def) {\r
554                     return def.id === id;\r
555                 })[0],\r
556                 params = (obj && obj.parameter) ? obj.parameter : [];\r
557 \r
558             return params;\r
559 \r
560         };\r
561 \r
562         s.getPropFromListByProp = function(list, propSrc, targetValue, propDst) {\r
563             var output = null,\r
564                 selectedObj = list.filter(function(e) {\r
565                     return e[propSrc] === targetValue;\r
566                 })[0];\r
567 \r
568             if(selectedObj) {\r
569                 if(propDst) {\r
570                     output = selectedObj[propDst];\r
571                 } else {\r
572                     output = selectedObj;\r
573                 }\r
574             }\r
575 \r
576             return output;\r
577         };\r
578 \r
579         return s;\r
580 \r
581     });\r
582 \r
583     gbp.register.factory('GBPGovernanceServices', function(TopologyDataLoaders) {\r
584         var s = {};\r
585 \r
586         var subjectInList = function(subjectName, subjectList) {\r
587             return subjectList.some(function(s) {\r
588                 return s.name === subjectName;\r
589             });\r
590         };\r
591 \r
592         var EPG = function(epgId, tenantId) {\r
593             this.id = epgId;\r
594             this.tenantId = tenantId;\r
595         };\r
596 \r
597         var Subject = function(name) {\r
598             this.name = name;\r
599             this.rules = [];\r
600             this.providers = [];\r
601             this.consumers = [];\r
602 \r
603             this.addProvider = function(providingEpg) {\r
604                 if(this.providers.indexOf(providingEpg) === -1) {\r
605                     this.providers.push(providingEpg);\r
606                 }\r
607             };\r
608 \r
609             this.addConsumer = function(consumingEpg) {\r
610                 if(this.consumers.indexOf(consumingEpg) === -1) {\r
611                     this.consumers.push(consumingEpg);\r
612                 }\r
613             };\r
614 \r
615             this.addRule = function(rule, classifierInstances) {\r
616                 if(rule['classifier-ref'] && rule['classifier-ref'].length > 0) {\r
617                     \r
618                     rule['classifier-ref'].forEach(function(cr) {\r
619                         //cr['parameters'] = [];\r
620                         classifierInstances.forEach(function(ci) {\r
621                             if(ci['name'] === cr['instance-name']) {\r
622                                 cr['parameters'] = ci['parameter-value'];\r
623                             }\r
624                         });\r
625                     });\r
626                 }\r
627 \r
628                 this.rules.push(rule);\r
629             };\r
630         };\r
631 \r
632         var addEpg = function(epgList, epgId, tenantId) {\r
633                 var addedEpg = null;\r
634 \r
635                 if(epgList.some(function(epg) {\r
636                     return epg.id === epgId && epg.tenantId === tenantId;\r
637                 }) === false) {\r
638                     addedEpg = new EPG(epgId, tenantId);\r
639                 }\r
640 \r
641                 if(addedEpg !== null) {\r
642                     epgList.push(addedEpg);\r
643                 }\r
644 \r
645                 return addedEpg;\r
646             },\r
647             addSubject = function(subject, subjects, providerEpg, consumerEpg, classifierInstances) {\r
648                 //console.log('classifierInstances:', classifierInstances);\r
649                 var existingSubject = subjects.filter(function(s) {\r
650                         return s.name === subject.name;\r
651                     })[0],\r
652                     newSubject = (existingSubject === undefined);\r
653 \r
654                 if(newSubject) {\r
655                     existingSubject = new Subject(subject.name);\r
656                 }\r
657 \r
658                 existingSubject.addProvider(providerEpg);\r
659                 existingSubject.addConsumer(consumerEpg);\r
660                 \r
661                 if(subject['ui-rule'] && subject['ui-rule'].length > 0) {\r
662                     subject['ui-rule'].forEach(function(r) {\r
663                         existingSubject.addRule(r, classifierInstances);\r
664                     });\r
665                 }\r
666                 \r
667                 if(newSubject) {\r
668                     subjects.push(existingSubject);\r
669                 }\r
670             },\r
671             processPairData = function(providers, consumers, subjects, pairData, classifierInstances) {\r
672                 addEpg(providers, pairData['provider-endpoint-group-id'], pairData['provider-tenant-id']);\r
673                 addEpg(consumers, pairData['consumer-endpoint-group-id'], pairData['consumer-tenant-id']);\r
674 \r
675                 pairData['ui-subject'].forEach(function(s) {\r
676                     addSubject(s, subjects, pairData['provider-endpoint-group-id'], pairData['consumer-endpoint-group-id'], classifierInstances);\r
677                 });\r
678             };\r
679 \r
680         s.getEPGsAndSubjects = function(tenantId, classifierInstances, successCbk, errorCbk) {\r
681             TopologyDataLoaders.getSubjectsBetweenEndpointGroups(false, tenantId, \r
682                 function(data) {\r
683                     var epgPairs = data.output['endpoint-group-pair-with-subject'],\r
684                         consumers = [],\r
685                         providers = [],\r
686                         subjects = [];\r
687 \r
688                     if(epgPairs) {\r
689                         epgPairs.forEach(function(p) {\r
690                             processPairData(providers, consumers, subjects, p, classifierInstances);\r
691                         });\r
692                     }\r
693 \r
694                     successCbk({providers: providers, consumers: consumers, subjects: subjects});\r
695                 },\r
696                 function() {\r
697                     //TODO log error\r
698             });\r
699         };\r
700 \r
701         return s;\r
702     });\r
703 \r
704     gbp.register.factory('GBPTenantServices', function(GPBServices) {\r
705 \r
706         var s = {};\r
707 \r
708         var Tenant = function(id, name, description) {\r
709             this.id = id || GPBServices.getUUIDnumber();\r
710             this.name = name || null;\r
711             this.description = description || null;\r
712         };\r
713 \r
714         var createBaseRestObj = function() {\r
715             return GPBServices\r
716                 .createRestObj().one('policy:tenants');\r
717         };\r
718 \r
719         var createRestObj = function(pathObj) {\r
720             return createBaseRestObj().one('tenant').one(pathObj.tenantId);\r
721         };\r
722 \r
723         var transformCallback = function(rawData) {\r
724             // return rawData.map(function(rawObj){\r
725             //     return new Tenant(rawObj.id, rawObj.name, rawObj.description);\r
726             // });\r
727             return rawData.tenants.tenant;\r
728         };\r
729 \r
730         var createData = function(obj) {\r
731             return { tenant : [ GPBServices.stripNullValues(obj) ] };\r
732         };\r
733 \r
734         s.createPathObj = function(tenantId) {\r
735             return {\r
736                 tenantId: tenantId\r
737             };\r
738         };\r
739 \r
740         s.createObj = function() {\r
741             return new Tenant();\r
742         };\r
743 \r
744         s.send = function(path, obj, successCbk, errorCbk) {\r
745             var restObj = createRestObj(path),\r
746                 reqData = createData(obj);\r
747 \r
748             GPBServices.send(restObj, reqData, successCbk, errorCbk);\r
749         };\r
750 \r
751         s.modify = function(path, obj, successCbk, errorCbk) {\r
752             var restObj = createRestObj(path),\r
753                 reqData = createData(obj);\r
754 \r
755             GPBServices.send(restObj, reqData, successCbk, errorCbk);\r
756         };\r
757 \r
758         s.delete = function(path, successCbk, errorCbk) {\r
759             var restObj = createRestObj(path);\r
760 \r
761             GPBServices.delete(restObj, successCbk, errorCbk);\r
762         };\r
763 \r
764         s.load = function(successCbk, errorCbk) {\r
765             var restObj = createBaseRestObj();\r
766             GPBServices.load(restObj, transformCallback, successCbk, errorCbk);\r
767         };\r
768 \r
769         return s;\r
770 \r
771     });\r
772 \r
773     gbp.register.factory('GBPContractServices', function(GPBServices) {\r
774 \r
775         var s = {};\r
776 \r
777         var Contract = function(id, description, parent) {\r
778             this.id = id || GPBServices.getUUIDnumber();\r
779             this.description = description || null;\r
780             this.parent = parent || null;\r
781         };\r
782 \r
783         var createBaseRestObj = function(pathObj) {\r
784             return GPBServices.createRestObj().one('policy:tenants').one('tenant').one(pathObj.tenantId);\r
785         };\r
786 \r
787         var createRestObj = function(pathObj) {\r
788             return createBaseRestObj(pathObj).one('contract').one(pathObj.contractId);\r
789         };\r
790 \r
791         var transformCallback = function(rawData) {\r
792             // return rawData.map(function(rawObj){\r
793             //     return new Contract(rawObj.id, rawObj.description);\r
794             // });\r
795             return rawData.tenant[0].contract;\r
796         };\r
797 \r
798         var createData = function(obj) {\r
799             return { contract : [ GPBServices.stripNullValues(obj) ] };\r
800         };\r
801 \r
802         s.createPathObj = function(tenantId, contractId) {\r
803             return {\r
804                 tenantId: tenantId,\r
805                 contractId: contractId\r
806             };\r
807         };\r
808 \r
809         s.createObj = function() {\r
810             return new Contract();\r
811         };\r
812 \r
813         s.send = function(path, obj, successCbk, errorCbk) {\r
814             var restObj = createRestObj(path),\r
815                 reqData = createData(obj);\r
816 \r
817             GPBServices.send(restObj, reqData, successCbk, errorCbk);\r
818         };\r
819 \r
820         s.delete = function(path, successCbk, errorCbk) {\r
821             var restObj = createRestObj(path);\r
822 \r
823             GPBServices.delete(restObj, successCbk, errorCbk);\r
824         };\r
825 \r
826         s.load = function(path, successCbk, errorCbk) {\r
827             var restObj = createBaseRestObj(path);\r
828 \r
829             GPBServices.load(restObj, transformCallback, successCbk, errorCbk);\r
830         };\r
831 \r
832         return s;\r
833 \r
834     });\r
835 \r
836     gbp.register.factory('GBPClauseServices', function(GPBServices) {\r
837 \r
838         var s = {};\r
839 \r
840         var Clause = function(name, subjectRefs) {\r
841             this.name = name || null;\r
842             this['subject-refs'] = subjectRefs || [];\r
843         };\r
844 \r
845         var createBaseRestObj = function(pathObj) {\r
846             return GPBServices.createRestObj()\r
847                 .one('policy:tenants').one('tenant').one(pathObj.tenantId)\r
848                 .one('contract').one(pathObj.contractId);\r
849         };\r
850 \r
851         var createRestObj = function(pathObj) {\r
852             return createBaseRestObj(pathObj).one('clause').one(pathObj.clauseId);\r
853         };\r
854 \r
855         var transformCallback = function(rawData) {\r
856             var data = null,\r
857                 clauseData = rawData.contract[0].clause;\r
858 \r
859             if(clauseData) {\r
860                 data = clauseData.map(function(elem) {\r
861                     if(elem.hasOwnProperty('subject-refs') === false) {\r
862                         elem['subject-refs'] = [];\r
863                     }\r
864                     return elem;\r
865                 });\r
866             }\r
867 \r
868             return data;\r
869         };\r
870 \r
871         var createData = function(obj) {\r
872             var o = GPBServices.stripNullValues(obj);\r
873 \r
874             if(o['subject-refs']) {\r
875                 o['subject-refs'] = GPBServices.removeEmptyElementsFromList(o['subject-refs']);\r
876             }\r
877 \r
878             return { clause : [ o ] };\r
879         };\r
880 \r
881         s.createPathObj = function(tenantId, contractId, clauseId) {\r
882             return {\r
883                 tenantId: tenantId,\r
884                 contractId: contractId,\r
885                 clauseId: clauseId\r
886             };\r
887         };\r
888 \r
889         s.createObj = function() {\r
890             return new Clause();\r
891         };\r
892 \r
893         s.send = function(path, obj, successCbk, errorCbk) {\r
894             var restObj = createRestObj(path),\r
895                 reqData = createData(obj);\r
896 \r
897             GPBServices.send(restObj, reqData, successCbk, errorCbk);\r
898         };\r
899 \r
900         s.delete = function(path, successCbk, errorCbk) {\r
901             var restObj = createRestObj(path);\r
902 \r
903             GPBServices.delete(restObj, successCbk, errorCbk);\r
904         };\r
905 \r
906         s.load = function(path, successCbk, errorCbk) {\r
907             var restObj = createBaseRestObj(path);\r
908 \r
909             GPBServices.load(restObj, transformCallback, successCbk, errorCbk);\r
910         };\r
911 \r
912         return s;\r
913 \r
914     });\r
915 \r
916     gbp.register.factory('GBPSubjectServices', function(GPBServices) {\r
917 \r
918         var s = {};\r
919 \r
920         var Subject = function(name, order) {\r
921             this.name = name || null;\r
922             this.order = order || null;\r
923         };\r
924 \r
925         var createBaseRestObj = function(pathObj) {\r
926             return GPBServices.createRestObj()\r
927                 .one('policy:tenants').one('tenant').one(pathObj.tenantId)\r
928                 .one('contract').one(pathObj.contractId);\r
929         };\r
930 \r
931         var createRestObj = function(pathObj) {\r
932             return createBaseRestObj(pathObj).one('subject').one(pathObj.subjectId);\r
933         };\r
934 \r
935         var transformCallback = function(rawData) {\r
936             // return rawData.map(function(rawObj){\r
937             //     return new Subject(rawObj.name, rawObj.order);\r
938             // });\r
939             return rawData.contract[0].subject;\r
940         };\r
941 \r
942         var createData = function(obj) {\r
943             return { subject : [ GPBServices.stripNullValues(obj) ] };\r
944         };\r
945 \r
946         s.createPathObj = function(tenantId, contractId, subjectId) {\r
947             return {\r
948                 tenantId: tenantId,\r
949                 contractId: contractId,\r
950                 subjectId: subjectId\r
951             };\r
952         };\r
953 \r
954         s.createObj = function() {\r
955             return new Subject();\r
956         };\r
957 \r
958         s.send = function(path, obj, successCbk, errorCbk) {\r
959             var restObj = createRestObj(path),\r
960                 reqData = createData(obj);\r
961 \r
962             GPBServices.send(restObj, reqData, successCbk, errorCbk);\r
963         };\r
964 \r
965         s.delete = function(path, successCbk, errorCbk) {\r
966             var restObj = createRestObj(path);\r
967 \r
968             GPBServices.delete(restObj, successCbk, errorCbk);\r
969         };\r
970 \r
971         s.load = function(path, successCbk, errorCbk) {\r
972             var restObj = createBaseRestObj(path);\r
973 \r
974             GPBServices.load(restObj, transformCallback, successCbk, errorCbk);\r
975         };\r
976 \r
977         return s;\r
978 \r
979     });\r
980 \r
981     gbp.register.factory('GBPRuleServices', function(GPBServices) {\r
982 \r
983         var s = {};\r
984 \r
985         var Rule = function(name, order) {\r
986             this.name = name || null;\r
987             this.order = order || null;\r
988         };\r
989 \r
990         var createBaseRestObj = function(pathObj) {\r
991             return GPBServices.createRestObj()\r
992                 .one('policy:tenants').one('tenant')\r
993                 .one(pathObj.tenantId).one('contract').one(pathObj.contractId)\r
994                 .one('subject').one(pathObj.subjectId);\r
995         };\r
996 \r
997         var createRestObj = function(pathObj) {\r
998             return createBaseRestObj(pathObj).one('rule').one(pathObj.ruleId);\r
999         };\r
1000 \r
1001         var transformCallback = function(rawData) {\r
1002             // return rawData.map(function(rawObj){\r
1003             //     return new Rule(rawObj.name, rawObj.order);\r
1004             // });\r
1005             return rawData.subject[0].rule;\r
1006         };\r
1007 \r
1008         var createData = function(obj) {\r
1009             return { rule : [ GPBServices.stripNullValues(obj) ] };\r
1010         };\r
1011 \r
1012         s.createPathObj = function(tenantId, contractId, subjectId, ruleId) {\r
1013             return {\r
1014                 tenantId: tenantId,\r
1015                 contractId: contractId,\r
1016                 subjectId: subjectId,\r
1017                 ruleId: ruleId\r
1018             };\r
1019         };\r
1020 \r
1021         s.createObj = function() {\r
1022             return new Rule();\r
1023         };\r
1024 \r
1025         s.send = function(path, obj, successCbk, errorCbk) {\r
1026             var restObj = createRestObj(path),\r
1027                 reqData = createData(obj);\r
1028 \r
1029             GPBServices.send(restObj, reqData, successCbk, errorCbk);\r
1030         };\r
1031 \r
1032         s.delete = function(path, successCbk, errorCbk) {\r
1033             var restObj = createRestObj(path);\r
1034 \r
1035             GPBServices.delete(restObj, successCbk, errorCbk);\r
1036         };\r
1037 \r
1038         s.load = function(path, successCbk, errorCbk) {\r
1039             var restObj = createBaseRestObj(path);\r
1040 \r
1041             GPBServices.load(restObj, transformCallback, successCbk, errorCbk);\r
1042         };\r
1043 \r
1044         return s;\r
1045 \r
1046     });\r
1047 \r
1048     gbp.register.factory('GBPClassifierRefsServices', function(GPBServices) {\r
1049 \r
1050         var s = {};\r
1051 \r
1052         var ClassifierRef = function(name, direction, instanceName, connectionTracking) {\r
1053             this.name = name || null;\r
1054             this.direction = direction || null;\r
1055             this['instance-name'] = instanceName || null;\r
1056             this['connection-tracking'] = connectionTracking || null;\r
1057         };\r
1058 \r
1059         var createBaseRestObj = function(pathObj) {\r
1060             return GPBServices.createRestObj()\r
1061                 .one('policy:tenants').one('tenant')\r
1062                 .one(pathObj.tenantId).one('contract').one(pathObj.contractId)\r
1063                 .one('subject').one(pathObj.subjectId)\r
1064                 .one('rule').one(pathObj.ruleId);\r
1065         };\r
1066 \r
1067         var createRestObj = function(pathObj) {\r
1068             return createBaseRestObj(pathObj).one('classifier-ref').one(pathObj.classifierRefId);\r
1069         };\r
1070 \r
1071         var transformCallback = function(rawData) {\r
1072             // return rawData.map(function(rawObj){\r
1073             //     return new ClassifierRef(rawObj.name, rawObj.direction, rawObj['instance-name']);\r
1074             // });\r
1075             return rawData.rule[0]['classifier-ref'];\r
1076         };\r
1077 \r
1078         var createData = function(obj) {\r
1079             return { 'classifier-ref' : [ GPBServices.stripNullValues(obj) ] };\r
1080         };\r
1081 \r
1082         s.createPathObj = function(tenantId, contractId, subjectId, ruleId, classifierRefId) {\r
1083             return {\r
1084                 tenantId: tenantId,\r
1085                 contractId: contractId,\r
1086                 subjectId: subjectId,\r
1087                 ruleId: ruleId,\r
1088                 classifierRefId: classifierRefId\r
1089             };\r
1090         };\r
1091 \r
1092         s.createObj = function() {\r
1093             return new ClassifierRef();\r
1094         };\r
1095 \r
1096         s.send = function(path, obj, successCbk, errorCbk) {\r
1097             var restObj = createRestObj(path),\r
1098                 reqData = createData(obj);\r
1099 \r
1100             GPBServices.send(restObj, reqData, successCbk, errorCbk);\r
1101         };\r
1102 \r
1103         s.delete = function(path, successCbk, errorCbk) {\r
1104             var restObj = createRestObj(path);\r
1105 \r
1106             GPBServices.delete(restObj, successCbk, errorCbk);\r
1107         };\r
1108 \r
1109         s.load = function(path, successCbk, errorCbk) {\r
1110             var restObj = createBaseRestObj(path);\r
1111 \r
1112             GPBServices.load(restObj, transformCallback, successCbk, errorCbk);\r
1113         };\r
1114 \r
1115         return s;\r
1116 \r
1117     });\r
1118 \r
1119     gbp.register.factory('GBPActionRefsServices', function(GPBServices) {\r
1120 \r
1121         var s = {};\r
1122 \r
1123         var ActionRef = function(name, order, instanceName) {\r
1124             this.name = name || null;\r
1125             this.order = order || null;\r
1126         };\r
1127 \r
1128         var createBaseRestObj = function(pathObj) {\r
1129             return GPBServices.createRestObj()\r
1130                 .one('policy:tenants').one('tenant')\r
1131                 .one(pathObj.tenantId).one('contract').one(pathObj.contractId)\r
1132                 .one('subject').one(pathObj.subjectId)\r
1133                 .one('rule').one(pathObj.ruleId);\r
1134         };\r
1135 \r
1136         var createRestObj = function(pathObj) {\r
1137             return createBaseRestObj(pathObj).one('action-ref').one(pathObj.actionRefId);\r
1138         };\r
1139 \r
1140         var transformCallback = function(rawData) {\r
1141             // return rawData.map(function(rawObj){\r
1142             //     return new ActionRef(rawObj.name, rawObj.order);\r
1143             // });\r
1144             return rawData.rule[0]['action-ref'];\r
1145         };\r
1146 \r
1147         var createData = function(obj) {\r
1148             return { 'action-ref' : [ GPBServices.stripNullValues(obj) ] };\r
1149         };\r
1150 \r
1151         s.createPathObj = function(tenantId, contractId, subjectId, ruleId, actionRefId) {\r
1152             return {\r
1153                 tenantId: tenantId,\r
1154                 contractId: contractId,\r
1155                 subjectId: subjectId,\r
1156                 ruleId: ruleId,\r
1157                 actionRefId: actionRefId\r
1158             };\r
1159         };\r
1160 \r
1161         s.createObj = function() {\r
1162             return new ActionRef();\r
1163         };\r
1164 \r
1165         s.send = function(path, obj, successCbk, errorCbk) {\r
1166             var restObj = createRestObj(path),\r
1167                 reqData = createData(obj);\r
1168 \r
1169             GPBServices.send(restObj, reqData, successCbk, errorCbk);\r
1170         };\r
1171 \r
1172         s.delete = function(path, successCbk, errorCbk) {\r
1173             var restObj = createRestObj(path);\r
1174 \r
1175             GPBServices.delete(restObj, successCbk, errorCbk);\r
1176         };\r
1177 \r
1178         s.load = function(path, successCbk, errorCbk) {\r
1179             var restObj = createBaseRestObj(path);\r
1180 \r
1181             GPBServices.load(restObj, transformCallback, successCbk, errorCbk);\r
1182         };\r
1183 \r
1184         return s;\r
1185 \r
1186     });\r
1187 \r
1188     gbp.register.factory('GBPL2FloodDomainServices', function(GPBServices) {\r
1189 \r
1190         var s = {};\r
1191 \r
1192         var L2FloodDomain = function(id, name, description, parent) {\r
1193             this.id = id || GPBServices.getUUIDnumber();\r
1194             this.name = name || null;\r
1195             this.description = description || null;\r
1196             this.parent = parent || null;\r
1197         };\r
1198 \r
1199         var createBaseRestObj = function(pathObj) {\r
1200             return GPBServices.createRestObj()\r
1201                 .one('policy:tenants').one('tenant').one(pathObj.tenantId);\r
1202         };\r
1203 \r
1204         var createRestObj = function(pathObj) {\r
1205             return createBaseRestObj(pathObj).one('l2-flood-domain').one(pathObj.l2FloodDomain);\r
1206         };\r
1207 \r
1208         var transformCallback = function(rawData) {\r
1209             // return rawData.map(function(rawObj){\r
1210             //     return new L2FloodDomain(rawObj.id, rawObj.name, rawObj.description, rawObj.parent);\r
1211             // });\r
1212             return rawData.tenant[0]['l2-flood-domain'];\r
1213         };\r
1214 \r
1215         var createData = function(obj) {\r
1216             return { 'l2-flood-domain' : [ GPBServices.stripNullValues(obj) ] };\r
1217         };\r
1218 \r
1219         s.createPathObj = function(tenantId, l2FloodDomain) {\r
1220             return {\r
1221                 tenantId: tenantId,\r
1222                 l2FloodDomain: l2FloodDomain\r
1223             };\r
1224         };\r
1225 \r
1226         s.createObj = function() {\r
1227             return new L2FloodDomain();\r
1228         };\r
1229 \r
1230         s.send = function(path, obj, successCbk, errorCbk) {\r
1231             var restObj = createRestObj(path),\r
1232                 reqData = createData(obj);\r
1233 \r
1234             GPBServices.send(restObj, reqData, successCbk, errorCbk);\r
1235         };\r
1236 \r
1237         s.delete = function(path, successCbk, errorCbk) {\r
1238             var restObj = createRestObj(path);\r
1239 \r
1240             GPBServices.delete(restObj, successCbk, errorCbk);\r
1241         };\r
1242 \r
1243         s.load = function(path, successCbk, errorCbk) {\r
1244             var restObj = createBaseRestObj(path);\r
1245 \r
1246             GPBServices.load(restObj, transformCallback, successCbk, errorCbk);\r
1247         };\r
1248 \r
1249         return s;\r
1250 \r
1251     });\r
1252 \r
1253     gbp.register.factory('GBPL2BridgeDomainServices', function(GPBServices) {\r
1254 \r
1255         var s = {};\r
1256 \r
1257         var L2BridgeDomain = function(id, name, description, parent) {\r
1258             this.id = id || GPBServices.getUUIDnumber();\r
1259             this.name = name || null;\r
1260             this.description = description || null;\r
1261             this.parent = parent || null;\r
1262         };\r
1263 \r
1264         var createBaseRestObj = function(pathObj) {\r
1265             return GPBServices.createRestObj()\r
1266                 .one('policy:tenants').one('tenant')\r
1267                 .one(pathObj.tenantId);\r
1268         };\r
1269 \r
1270         var createRestObj = function(pathObj) {\r
1271             return createBaseRestObj(pathObj).one('l2-bridge-domain').one(pathObj.l2BridgeDomain);\r
1272         };\r
1273 \r
1274         var transformCallback = function(rawData) {\r
1275             // return rawData.map(function(rawObj){\r
1276             //     return new L2BridgeDomain(rawObj.id, rawObj.name, rawObj.description, rawObj.parent);\r
1277             // });\r
1278             return rawData.tenant[0]['l2-bridge-domain'];\r
1279         };\r
1280 \r
1281         var createData = function(obj) {\r
1282             return { 'l2-bridge-domain' : [ GPBServices.stripNullValues(obj) ] };\r
1283         };\r
1284 \r
1285         s.createPathObj = function(tenantId, l2BridgeDomain) {\r
1286             return {\r
1287                 tenantId: tenantId,\r
1288                 l2BridgeDomain: l2BridgeDomain\r
1289             };\r
1290         };\r
1291 \r
1292         s.createObj = function() {\r
1293             return new L2BridgeDomain();\r
1294         };\r
1295 \r
1296         s.send = function(path, obj, successCbk, errorCbk) {\r
1297             var restObj = createRestObj(path),\r
1298                 reqData = createData(obj);\r
1299 \r
1300             GPBServices.send(restObj, reqData, successCbk, errorCbk);\r
1301         };\r
1302 \r
1303         s.delete = function(path, successCbk, errorCbk) {\r
1304             var restObj = createRestObj(path);\r
1305 \r
1306             GPBServices.delete(restObj, successCbk, errorCbk);\r
1307         };\r
1308 \r
1309         s.load = function(path, successCbk, errorCbk) {\r
1310             var restObj = createBaseRestObj(path);\r
1311 \r
1312             GPBServices.load(restObj, transformCallback, successCbk, errorCbk);\r
1313         };\r
1314 \r
1315         return s;\r
1316 \r
1317     });\r
1318 \r
1319     gbp.register.factory('GBPL3ContextServices', function(GPBServices) {\r
1320 \r
1321         var s = {};\r
1322 \r
1323         var L3Context = function(id, name, description) {\r
1324             this.id = id || GPBServices.getUUIDnumber();\r
1325             this.name = name || null;\r
1326             this.description = description || null;\r
1327         };\r
1328 \r
1329         var createBaseRestObj = function(pathObj) {\r
1330             return GPBServices.createRestObj()\r
1331                 .one('policy:tenants').one('tenant').one(pathObj.tenantId);\r
1332         };\r
1333 \r
1334         var createRestObj = function(pathObj) {\r
1335             return createBaseRestObj(pathObj).one('l3-context').one(pathObj.l3Context);\r
1336         };\r
1337 \r
1338         var transformCallback = function(rawData) {\r
1339             // return rawData.map(function(rawObj){\r
1340             //     return new L3Context(rawObj.id, rawObj.name, rawObj.description);\r
1341             // });\r
1342             return rawData.tenant[0]['l3-context'];\r
1343         };\r
1344 \r
1345         var createData = function(obj) {\r
1346             return { 'l3-context' : [ GPBServices.stripNullValues(obj) ] };\r
1347         };\r
1348 \r
1349         s.createPathObj = function(tenantId, l3Context) {\r
1350             return {\r
1351                 tenantId: tenantId,\r
1352                 l3Context: l3Context\r
1353             };\r
1354         };\r
1355 \r
1356         s.createObj = function() {\r
1357             return new L3Context();\r
1358         };\r
1359 \r
1360         s.send = function(path, obj, successCbk, errorCbk) {\r
1361             var restObj = createRestObj(path),\r
1362                 reqData = createData(obj);\r
1363 \r
1364             GPBServices.send(restObj, reqData, successCbk, errorCbk);\r
1365         };\r
1366 \r
1367         s.delete = function(path, successCbk, errorCbk) {\r
1368             var restObj = createRestObj(path);\r
1369 \r
1370             GPBServices.delete(restObj, successCbk, errorCbk);\r
1371         };\r
1372 \r
1373         s.load = function(path, successCbk, errorCbk) {\r
1374             var restObj = createBaseRestObj(path);\r
1375 \r
1376             GPBServices.load(restObj, transformCallback, successCbk, errorCbk);\r
1377         };\r
1378 \r
1379         return s;\r
1380 \r
1381     });\r
1382 \r
1383     gbp.register.factory('GBPSubnetServices', function(GPBServices) {\r
1384 \r
1385         var s = {};\r
1386 \r
1387         var Subnet = function(id, name, description, parent, ipPrefix, virtualRouterIp) {\r
1388             this.id = id || GPBServices.getUUIDnumber();\r
1389             this.name = name || null;\r
1390             this.description = description || null;\r
1391             this.parent = parent || null;\r
1392             this['ip-prefix'] = ipPrefix || null;\r
1393             this['virtual-router-ip'] = virtualRouterIp || null;\r
1394         };\r
1395 \r
1396         var createBaseRestObj = function(pathObj) {\r
1397             return GPBServices.createRestObj()\r
1398                 .one('policy:tenants').one('tenant').one(pathObj.tenantId);\r
1399         };\r
1400 \r
1401         var createRestObj = function(pathObj) {\r
1402             return createBaseRestObj(pathObj).one('subnet').one(pathObj.subnet);\r
1403         };\r
1404 \r
1405         var transformCallback = function(rawData) {\r
1406             // return rawData.map(function(rawObj){\r
1407             //     return new L3Context(rawObj.id, rawObj.name, rawObj.description);\r
1408             // });\r
1409             return rawData.tenant[0]['subnet'];\r
1410         };\r
1411 \r
1412         var createData = function(obj) {\r
1413             return { 'subnet' : [ GPBServices.stripNullValues(obj) ] };\r
1414         };\r
1415 \r
1416         s.createPathObj = function(tenantId, subnet) {\r
1417             return {\r
1418                 tenantId: tenantId,\r
1419                 subnet: subnet\r
1420             };\r
1421         };\r
1422 \r
1423         s.createObj = function() {\r
1424             return new Subnet();\r
1425         };\r
1426 \r
1427         s.send = function(path, obj, successCbk, errorCbk) {\r
1428             var restObj = createRestObj(path),\r
1429                 reqData = createData(obj);\r
1430 \r
1431             GPBServices.send(restObj, reqData, successCbk, errorCbk);\r
1432         };\r
1433 \r
1434         s.delete = function(path, successCbk, errorCbk) {\r
1435             var restObj = createRestObj(path);\r
1436 \r
1437             GPBServices.delete(restObj, successCbk, errorCbk);\r
1438         };\r
1439 \r
1440         s.load = function(path, successCbk, errorCbk) {\r
1441             var restObj = createBaseRestObj(path);\r
1442 \r
1443             GPBServices.load(restObj, transformCallback, successCbk, errorCbk);\r
1444         };\r
1445 \r
1446         return s;\r
1447 \r
1448     });\r
1449 \r
1450     gbp.register.factory('GBPGatewayServices', function(GPBServices) {\r
1451 \r
1452         var s = {};\r
1453 \r
1454         var Gateway = function(gateway) {\r
1455             this.gateway = gateway || null;\r
1456         };\r
1457 \r
1458         var createBaseRestObj = function(pathObj) {\r
1459             return GPBServices.createRestObj()\r
1460                 .one('policy:tenants').one('tenant').one(pathObj.tenantId).one('subnet').one(pathObj.subnetId);\r
1461         };\r
1462 \r
1463         var createRestObj = function(pathObj) {\r
1464             return createBaseRestObj(pathObj).one('gateways').one(pathObj.gateway);\r
1465         };\r
1466 \r
1467         var transformCallback = function(rawData) {\r
1468             // return rawData.map(function(rawObj){\r
1469             //     return new L3Context(rawObj.id, rawObj.name, rawObj.description);\r
1470             // });\r
1471             return rawData.subnet[0]['gateways'];\r
1472         };\r
1473 \r
1474         var createData = function(obj) {\r
1475             return { 'gateways' : [ GPBServices.stripNullValues(obj) ] };\r
1476         };\r
1477 \r
1478         s.createPathObj = function(tenantId, subnetId, gateway) {\r
1479             return {\r
1480                 tenantId: tenantId,\r
1481                 subnetId: subnetId,\r
1482                 gateway: gateway\r
1483             };\r
1484         };\r
1485 \r
1486         s.createObj = function() {\r
1487             return new Gateway();\r
1488         };\r
1489 \r
1490         s.send = function(path, obj, successCbk, errorCbk) {\r
1491             var restObj = createRestObj(path),\r
1492                 reqData = createData(obj);\r
1493 \r
1494             GPBServices.send(restObj, reqData, successCbk, errorCbk);\r
1495         };\r
1496 \r
1497         s.delete = function(path, successCbk, errorCbk) {\r
1498             var restObj = createRestObj(path);\r
1499 \r
1500             GPBServices.delete(restObj, successCbk, errorCbk);\r
1501         };\r
1502 \r
1503         s.load = function(path, successCbk, errorCbk) {\r
1504             var restObj = createBaseRestObj(path);\r
1505 \r
1506             GPBServices.load(restObj, transformCallback, successCbk, errorCbk);\r
1507         };\r
1508 \r
1509         return s;\r
1510 \r
1511     });\r
1512 \r
1513     gbp.register.factory('GBPPrefixServices', function(GPBServices) {\r
1514 \r
1515         var s = {};\r
1516 \r
1517         var Prefix = function(prefix) {\r
1518             this.prefix = prefix || null;\r
1519         };\r
1520 \r
1521         var createBaseRestObj = function(pathObj) {\r
1522             return GPBServices.createRestObj()\r
1523                 .one('policy:tenants').one('tenant').one(pathObj.tenantId).one('subnet').one(pathObj.subnetId).one('gateways').one(pathObj.gatewayId);\r
1524         };\r
1525 \r
1526         var createRestObj = function(pathObj) {\r
1527             return createBaseRestObj(pathObj).one('prefixes').one(pathObj.prefixId);\r
1528         };\r
1529 \r
1530         var transformCallback = function(rawData) {\r
1531             // return rawData.map(function(rawObj){\r
1532             //     return new L3Context(rawObj.id, rawObj.name, rawObj.description);\r
1533             // });\r
1534             return rawData.gateways[0].prefixes;\r
1535         };\r
1536 \r
1537         var createData = function(obj) {\r
1538             return { 'prefixes' : [ GPBServices.stripNullValues(obj) ] };\r
1539         };\r
1540 \r
1541         s.createPathObj = function(tenantId, subnetId, gatewayId, prefixId) {\r
1542             return {\r
1543                 tenantId: tenantId,\r
1544                 subnetId: subnetId,\r
1545                 gatewayId: gatewayId,\r
1546                 prefixId: prefixId ? prefixId.replace("/", "%2F") : prefixId\r
1547             };\r
1548         };\r
1549 \r
1550         s.createObj = function() {\r
1551             return new Prefix();\r
1552         };\r
1553 \r
1554         s.send = function(path, obj, successCbk, errorCbk) {\r
1555             var restObj = createRestObj(path),\r
1556                 reqData = createData(obj);\r
1557 \r
1558             GPBServices.send(restObj, reqData, successCbk, errorCbk);\r
1559         };\r
1560 \r
1561         s.delete = function(path, successCbk, errorCbk) {\r
1562             var restObj = createRestObj(path);\r
1563 \r
1564             GPBServices.delete(restObj, successCbk, errorCbk);\r
1565         };\r
1566 \r
1567         s.load = function(path, successCbk, errorCbk) {\r
1568             var restObj = createBaseRestObj(path);\r
1569 \r
1570             GPBServices.load(restObj, transformCallback, successCbk, errorCbk);\r
1571         };\r
1572 \r
1573         return s;\r
1574 \r
1575     });\r
1576 \r
1577     gbp.register.factory('GBPClassifierInstanceServices', function(GPBServices) {\r
1578 \r
1579         var s = {};\r
1580 \r
1581         var ClassifierService = function(name, classifierDefId) {\r
1582             this.name = name || null;\r
1583             this['classifier-definition-id'] = classifierDefId || null;\r
1584             this['parameter-value'] = [];\r
1585         };\r
1586 \r
1587         var createBaseRestObj = function(pathObj) {\r
1588             return GPBServices.createRestObj()\r
1589                 .one('policy:tenants').one('tenant').one(pathObj.tenantId).one('subject-feature-instances');\r
1590         };\r
1591 \r
1592         var createRestObj = function(pathObj) {\r
1593             return createBaseRestObj(pathObj).one('classifier-instance').one(pathObj.classfierInstanceId);\r
1594         };\r
1595 \r
1596         var transformCallback = function(rawData) {\r
1597             return rawData['subject-feature-instances']['classifier-instance'];\r
1598         };\r
1599 \r
1600         var createData = function(obj) {\r
1601             return { 'classifier-instance' : [ GPBServices.stripNullValues(obj) ] };\r
1602         };\r
1603 \r
1604         s.createPathObj = function(tenantId, classfierInstanceId) {\r
1605             return {\r
1606                 tenantId: tenantId,\r
1607                 classfierInstanceId: classfierInstanceId\r
1608             };\r
1609         };\r
1610 \r
1611         s.createObj = function() {\r
1612             return new ClassifierService();\r
1613         };\r
1614 \r
1615         s.send = function(path, obj, successCbk, errorCbk) {\r
1616             var restObj = createRestObj(path),\r
1617                 reqData = createData(obj);\r
1618 \r
1619             GPBServices.send(restObj, reqData, successCbk, errorCbk);\r
1620         };\r
1621 \r
1622         s.delete = function(path, successCbk, errorCbk) {\r
1623             var restObj = createRestObj(path);\r
1624 \r
1625             GPBServices.delete(restObj, successCbk, errorCbk);\r
1626         };\r
1627 \r
1628         s.load = function(path, successCbk, errorCbk) {\r
1629             var restObj = createBaseRestObj(path);\r
1630 \r
1631             GPBServices.load(restObj, transformCallback, successCbk, errorCbk);\r
1632         };\r
1633 \r
1634         return s;\r
1635 \r
1636     });\r
1637 \r
1638     gbp.register.factory('GBPActionInstanceServices', function(GPBServices) {\r
1639 \r
1640         var s = {};\r
1641 \r
1642         var ActionService = function(name, actionDefId) {\r
1643             this.name = name || null;\r
1644             this['action-definition-id'] = actionDefId || null;\r
1645             this['parameter-value'] = [];\r
1646         };\r
1647 \r
1648         var createBaseRestObj = function(pathObj) {\r
1649             return GPBServices.createRestObj()\r
1650                 .one('policy:tenants').one('tenant').one(pathObj.tenantId).one('subject-feature-instances');\r
1651         };\r
1652 \r
1653         var createRestObj = function(pathObj) {\r
1654             return createBaseRestObj(pathObj).one('action-instance').one(pathObj.actionInstanceId);\r
1655         };\r
1656 \r
1657         var transformCallback = function(rawData) {\r
1658             return rawData['subject-feature-instances']['action-instance'];\r
1659         };\r
1660 \r
1661         var createData = function(obj) {\r
1662             return { 'action-instance' : [ GPBServices.stripNullValues(obj) ] };\r
1663         };\r
1664 \r
1665         s.createPathObj = function(tenantId, actionInstanceId) {\r
1666             return {\r
1667                 tenantId: tenantId,\r
1668                 actionInstanceId: actionInstanceId\r
1669             };\r
1670         };\r
1671 \r
1672         s.createObj = function() {\r
1673             return new ActionService();\r
1674         };\r
1675 \r
1676         s.send = function(path, obj, successCbk, errorCbk) {\r
1677             var restObj = createRestObj(path),\r
1678                 reqData = createData(obj);\r
1679 \r
1680             GPBServices.send(restObj, reqData, successCbk, errorCbk);\r
1681         };\r
1682 \r
1683         s.delete = function(path, successCbk, errorCbk) {\r
1684             var restObj = createRestObj(path);\r
1685 \r
1686             GPBServices.delete(restObj, successCbk, errorCbk);\r
1687         };\r
1688 \r
1689         s.load = function(path, successCbk, errorCbk) {\r
1690             var restObj = createBaseRestObj(path);\r
1691 \r
1692             GPBServices.load(restObj, transformCallback, successCbk, errorCbk);\r
1693         };\r
1694 \r
1695         s.getDefinitions = function(successCbk, errorCbk) {\r
1696             var restObj = GBPRestangular.one('restconf').one('operational').one('policy:subject-feature-definitions');\r
1697                 \r
1698             restObj.get().then(function(data) {\r
1699                 successCbk(data['subject-feature-definitions']['action-definition']);\r
1700             }, function(res) {\r
1701                 // errorCbk(res);\r
1702             });\r
1703         };\r
1704 \r
1705         return s;\r
1706 \r
1707     });\r
1708 \r
1709     gbp.register.factory('GBPEpgServices', function(GPBServices) {\r
1710 \r
1711         var s = {};\r
1712 \r
1713         var EPG = function(name, description, intraGroupPolicy, networkDomain, id, parent) {\r
1714             this.id = id || GPBServices.getUUIDnumber();\r
1715             this.name = name || null;\r
1716             this.description = description || null;\r
1717             this['intra-group-policy'] = intraGroupPolicy || null;\r
1718             this['network-domain'] = networkDomain || null;\r
1719             this.parent = parent || null;\r
1720         };\r
1721 \r
1722         var createBaseRestObj = function(pathObj) {\r
1723             return GPBServices.createRestObj()\r
1724                 .one('policy:tenants').one('tenant').one(pathObj.tenantId);\r
1725         };\r
1726 \r
1727         var createRestObj = function(pathObj) {\r
1728             return createBaseRestObj(pathObj).one('endpoint-group').one(pathObj.epgId);\r
1729         };\r
1730 \r
1731         var transformCallback = function(rawData) {\r
1732             return rawData.tenant[0]['endpoint-group'];\r
1733         };\r
1734 \r
1735         var createData = function(obj) {\r
1736             return { 'endpoint-group' : [ GPBServices.stripNullValues(obj) ] };\r
1737         };\r
1738 \r
1739         s.createPathObj = function(tenantId, epgId) {\r
1740             return {\r
1741                 tenantId: tenantId,\r
1742                 epgId: epgId\r
1743             };\r
1744         };\r
1745 \r
1746         s.createObj = function() {\r
1747             return new EPG();\r
1748         };\r
1749 \r
1750         s.send = function(path, obj, successCbk, errorCbk) {\r
1751             var restObj = createRestObj(path),\r
1752                 reqData = createData(obj);\r
1753 \r
1754             GPBServices.send(restObj, reqData, successCbk, errorCbk);\r
1755         };\r
1756 \r
1757         s.delete = function(path, successCbk, errorCbk) {\r
1758             var restObj = createRestObj(path);\r
1759 \r
1760             GPBServices.delete(restObj, successCbk, errorCbk);\r
1761         };\r
1762 \r
1763         s.load = function(path, successCbk, errorCbk) {\r
1764             var restObj = createBaseRestObj(path);\r
1765 \r
1766             GPBServices.load(restObj, transformCallback, successCbk, errorCbk);\r
1767         };\r
1768 \r
1769         return s;\r
1770 \r
1771     });\r
1772 \r
1773     gbp.register.factory('GBPConNamedSelServices', function(GPBServices) {\r
1774 \r
1775         var s = {};\r
1776 \r
1777         var ConsumerNamedSelector = function(name, contract) {\r
1778             this.name = name || null;\r
1779             this.contract = contract || [];\r
1780         };\r
1781 \r
1782         var createBaseRestObj = function(pathObj) {\r
1783             return GPBServices.createRestObj()\r
1784                 .one('policy:tenants').one('tenant').one(pathObj.tenantId).one('endpoint-group').one(pathObj.epgId);\r
1785         };\r
1786 \r
1787         var createRestObj = function(pathObj) {\r
1788             return createBaseRestObj(pathObj).one('consumer-named-selector').one(pathObj.cnsId);\r
1789         };\r
1790 \r
1791         var transformCallback = function(rawData) {\r
1792             var data = null,\r
1793                 consumerData = rawData['endpoint-group'][0]['consumer-named-selector'];\r
1794 \r
1795             if(consumerData) {\r
1796                 data = consumerData.map(function(elem) {\r
1797                     if(elem.hasOwnProperty('contract') === false) {\r
1798                         elem.contract = [];\r
1799                     }\r
1800                     return elem;\r
1801                 });\r
1802             }\r
1803 \r
1804             return data;\r
1805         };\r
1806 \r
1807         var createData = function(obj) {\r
1808             var o = GPBServices.stripNullValues(obj);\r
1809 \r
1810             if(o.contract) {\r
1811                 o.contract = GPBServices.removeEmptyElementsFromList(o.contract);\r
1812             }\r
1813 \r
1814             return { 'consumer-named-selector' : [ o ] };\r
1815         };\r
1816 \r
1817         s.createPathObj = function(tenantId, epgId, cnsId) {\r
1818             return {\r
1819                 tenantId: tenantId,\r
1820                 epgId: epgId,\r
1821                 cnsId: cnsId\r
1822             };\r
1823         };\r
1824 \r
1825         s.createObj = function() {\r
1826             return new ConsumerNamedSelector();\r
1827         };\r
1828 \r
1829         s.send = function(path, obj, successCbk, errorCbk) {\r
1830             var restObj = createRestObj(path),\r
1831                 reqData = createData(obj);\r
1832 \r
1833             GPBServices.send(restObj, reqData, successCbk, errorCbk);\r
1834         };\r
1835 \r
1836         s.delete = function(path, successCbk, errorCbk) {\r
1837             var restObj = createRestObj(path);\r
1838 \r
1839             GPBServices.delete(restObj, successCbk, errorCbk);\r
1840         };\r
1841 \r
1842         s.load = function(path, successCbk, errorCbk) {\r
1843             var restObj = createBaseRestObj(path);\r
1844 \r
1845             GPBServices.load(restObj, transformCallback, successCbk, errorCbk);\r
1846         };\r
1847 \r
1848         return s;\r
1849 \r
1850     });\r
1851 \r
1852 \r
1853     gbp.register.factory('GBPProNamedSelServices', function(GPBServices) {\r
1854 \r
1855         var s = {};\r
1856 \r
1857         var ProviderNamedSelector = function(name, contract) {\r
1858             this.name = name || null;\r
1859             this.contract = contract || [];\r
1860         };\r
1861 \r
1862         var createBaseRestObj = function(pathObj) {\r
1863             return GPBServices.createRestObj()\r
1864                 .one('policy:tenants').one('tenant').one(pathObj.tenantId).one('endpoint-group').one(pathObj.epgId);\r
1865         };\r
1866 \r
1867         var createRestObj = function(pathObj) {\r
1868             return createBaseRestObj(pathObj).one('provider-named-selector').one(pathObj.cnsId);\r
1869         };\r
1870 \r
1871         var transformCallback = function(rawData) {\r
1872             var data = null,\r
1873                 provderData = rawData['endpoint-group'][0]['provider-named-selector'];\r
1874 \r
1875             if(provderData) {\r
1876                 data = provderData.map(function(elem) {\r
1877                     if(elem.hasOwnProperty('contract') === false) {\r
1878                         elem.contract = [];\r
1879                     }\r
1880                     return elem;\r
1881                 });\r
1882             }\r
1883 \r
1884             return data;\r
1885         };\r
1886 \r
1887         var createData = function(obj) {\r
1888             var o = GPBServices.stripNullValues(obj);\r
1889 \r
1890             if(o.contract) {\r
1891                 o.contract = GPBServices.removeEmptyElementsFromList(o.contract);\r
1892             }\r
1893 \r
1894             return { 'provider-named-selector' : [ o ] };\r
1895         };\r
1896 \r
1897         s.createPathObj = function(tenantId, epgId, cnsId) {\r
1898             return {\r
1899                 tenantId: tenantId,\r
1900                 epgId: epgId,\r
1901                 cnsId: cnsId\r
1902             };\r
1903         };\r
1904 \r
1905         s.createObj = function() {\r
1906             return new ProviderNamedSelector();\r
1907         };\r
1908 \r
1909         s.send = function(path, obj, successCbk, errorCbk) {\r
1910             var restObj = createRestObj(path),\r
1911                 reqData = createData(obj);\r
1912 \r
1913             GPBServices.send(restObj, reqData, successCbk, errorCbk);\r
1914         };\r
1915 \r
1916         s.delete = function(path, successCbk, errorCbk) {\r
1917             var restObj = createRestObj(path);\r
1918 \r
1919             GPBServices.delete(restObj, successCbk, errorCbk);\r
1920         };\r
1921 \r
1922         s.load = function(path, successCbk, errorCbk) {\r
1923             var restObj = createBaseRestObj(path);\r
1924 \r
1925             GPBServices.load(restObj, transformCallback, successCbk, errorCbk);\r
1926         };\r
1927 \r
1928         return s;\r
1929 \r
1930     });\r
1931 \r
1932     gbp.register.factory('GBPEndpointServices', function(GPBServices) {\r
1933 \r
1934         var s = {};\r
1935 \r
1936         var Endpoint = function(tenantId) {\r
1937             this.tenant = tenantId || null;\r
1938             this['network-containment'] = null;\r
1939             this['endpoint-group'] = null;\r
1940             this['endpoint-groups'] = [];\r
1941             this.condition = [];\r
1942             this['l2-context'] = null;\r
1943             this['mac-address'] = null;\r
1944             this['l3-address'] = [];\r
1945         };\r
1946 \r
1947         var createRestObj = function() {\r
1948             return GPBServices.createRestObj('operations');\r
1949         };\r
1950 \r
1951         var transformCallback = function(rawData) {\r
1952             return rawData.endpoints.endpoint;\r
1953         };\r
1954 \r
1955         var createBaseData = function(obj) {\r
1956             var o = GPBServices.stripNullValues(obj);\r
1957 \r
1958             if(o.condition) {\r
1959                 o.condition = GPBServices.removeEmptyElementsFromList(o.condition);\r
1960             }\r
1961 \r
1962             if(o['endpoint-groups']) {\r
1963                 o['endpoint-groups'] = GPBServices.removeEmptyElementsFromList(o['endpoint-groups']);\r
1964             }\r
1965 \r
1966             if(o['l3-address']) {\r
1967                 o['l3-address'] = GPBServices.removeEmptyElementsFromList(o['l3-address']);\r
1968             }\r
1969 \r
1970             return o;\r
1971         };\r
1972 \r
1973         var createSendData = function(obj) {\r
1974             var o = createBaseData(obj);\r
1975             return { 'input': o };\r
1976         };\r
1977 \r
1978         var createDeleteData = function(obj) {\r
1979             var o = { \r
1980                 'input': { \r
1981                     'l3': obj['l3-address'],\r
1982                     'l2': [\r
1983                         { \r
1984                             'l2-context': obj['l2-context'],\r
1985                             'mac-address': obj['mac-address']\r
1986                         }\r
1987                     ] \r
1988                 } \r
1989             };\r
1990 \r
1991             return o;\r
1992         };\r
1993 \r
1994         s.createObj = function(tenantId) {\r
1995             return new Endpoint(tenantId);\r
1996         };\r
1997 \r
1998         s.send = function(path, obj, successCbk, errorCbk) {\r
1999             var restObj = createRestObj().one('endpoint:register-endpoint'),\r
2000                 reqData = createSendData(obj);\r
2001 \r
2002             GPBServices.post(restObj, reqData, successCbk, errorCbk);\r
2003         };\r
2004 \r
2005         s.delete = function(path, obj, successCbk, errorCbk) {\r
2006             var restObj = createRestObj(path).one('endpoint:unregister-endpoint'),\r
2007                 reqData = createDeleteData(obj);\r
2008             GPBServices.post(restObj, reqData, successCbk, errorCbk);\r
2009         };\r
2010 \r
2011         s.load = function(path, successCbk, errorCbk) {\r
2012             var restObj = GPBServices.createRestObj('operational').one('endpoint:endpoints');\r
2013 \r
2014             GPBServices.load(restObj, transformCallback, successCbk, errorCbk);\r
2015         };\r
2016 \r
2017         return s;\r
2018 \r
2019     });\r
2020 \r
2021     gbp.register.factory('GBPEndpointL3Services', function(GPBServices) {\r
2022 \r
2023         var s = {};\r
2024 \r
2025         var EndpointL3 = function(tenantId) {\r
2026             this.tenant = tenantId || null;\r
2027             this['endpoint-group'] = null;\r
2028             this['endpoint-groups'] = [];\r
2029             this.condition = [];\r
2030             this['l3-context'] = null;\r
2031             this['ip-prefix'] = null;\r
2032             this['endpoint-l2-gateways'] = [];\r
2033             this['endpoint-l3-gateways'] = [];\r
2034         };\r
2035 \r
2036         var createRestObj = function() {\r
2037             return GPBServices.createRestObj('operations');\r
2038         };\r
2039 \r
2040         var transformCallback = function(rawData) {\r
2041             return rawData.endpoints['endpoint-l3-prefix'];\r
2042         };\r
2043 \r
2044         var createBaseData = function(obj) {\r
2045             var o = GPBServices.stripNullValues(obj);\r
2046 \r
2047             if(o.condition) {\r
2048                 o.condition = GPBServices.removeEmptyElementsFromList(o.condition);\r
2049             }\r
2050 \r
2051             if(o['endpoint-groups']) {\r
2052                 o['endpoint-groups'] = GPBServices.removeEmptyElementsFromList(o['endpoint-groups']);\r
2053             }\r
2054 \r
2055             if(o['endpoint-l2-gateways']) {\r
2056                 o['endpoint-l2-gateways'] = GPBServices.removeEmptyElementsFromList(o['endpoint-l2-gateways']);\r
2057             }\r
2058 \r
2059             if(o['endpoint-l3-gateways']) {\r
2060                 o['endpoint-l3-gateways'] = GPBServices.removeEmptyElementsFromList(o['endpoint-l3-gateways']);\r
2061             }\r
2062 \r
2063             return o;\r
2064         };\r
2065 \r
2066         var createSendData = function(obj) {\r
2067             var o = createBaseData(obj);\r
2068             return { 'input': o };\r
2069         };\r
2070 \r
2071         var createDeleteData = function(obj) {\r
2072             var o = { \r
2073                 'input': { \r
2074                     'l3-prefix': [\r
2075                         {\r
2076                             'l3-context': obj['l3-context'],\r
2077                             'ip-prefix': obj['ip-prefix']\r
2078                         }\r
2079                     ],\r
2080                     'l2': obj['endpoint-l2-gateways'],\r
2081                     'l3': obj['endpoint-l3-gateways']\r
2082                 } \r
2083             };\r
2084 \r
2085             return o;\r
2086         };\r
2087 \r
2088         s.createObj = function(tenantId) {\r
2089             return new EndpointL3(tenantId);\r
2090         };\r
2091 \r
2092         s.send = function(path, obj, successCbk, errorCbk) {\r
2093             var restObj = createRestObj().one('endpoint:register-l3-prefix-endpoint'),\r
2094                 reqData = createSendData(obj);\r
2095 \r
2096             GPBServices.post(restObj, reqData, successCbk, errorCbk);\r
2097         };\r
2098 \r
2099         s.delete = function(path, obj, successCbk, errorCbk) {\r
2100             var restObj = createRestObj(path).one('endpoint:unregister-endpoint'),\r
2101                 reqData = createDeleteData(obj);\r
2102 \r
2103             GPBServices.post(restObj, reqData, successCbk, errorCbk);\r
2104         };\r
2105 \r
2106         s.load = function(path, successCbk, errorCbk) {\r
2107             var restObj = GPBServices.createRestObj('operational').one('endpoint:endpoints');\r
2108 \r
2109             GPBServices.load(restObj, transformCallback, successCbk, errorCbk);\r
2110         };\r
2111 \r
2112         return s;\r
2113 \r
2114     });\r
2115 \r
2116     gbp.register.factory('PGNServices', function(GBPRestangular) {\r
2117 \r
2118         var s = {};\r
2119 \r
2120         var idGetter = {};\r
2121 \r
2122         var idTypes = {\r
2123             tenant: 'TENANT',\r
2124             uuid: 'UUID',\r
2125             l3ctx: 'L3CTX',\r
2126             pathAction: 'PATHACTION',\r
2127             accessAction: 'ACCESSACTION'\r
2128         };\r
2129 \r
2130         idGetter[idTypes.tenant] = function() {\r
2131             return 1;\r
2132         };\r
2133 \r
2134         idGetter[idTypes.uuid] = function() {\r
2135             return 2;\r
2136         };\r
2137 \r
2138         idGetter[idTypes.l3ctx] = function() {\r
2139             return 3;\r
2140         };\r
2141 \r
2142         idGetter[idTypes.pathAction] = function() {\r
2143             return 4;\r
2144         };\r
2145 \r
2146         idGetter[idTypes.accessAction] = function() {\r
2147             return 5;\r
2148         };\r
2149 \r
2150         var getId = function(type) {\r
2151             if(idGetter.hasOwnProperty(type)) {\r
2152                 return id = idGetter[type]();\r
2153             } else {\r
2154                 throw "Cannot get idGetter for type " + type;\r
2155             }\r
2156         };\r
2157 \r
2158         s.addReplaceEndpointGroup = function(successCbk, errorCbk, groupName, sgt, description) {\r
2159             var tenantId = getId(idTypes.tenant),\r
2160                 uuid = getId(idTypes.uuid),\r
2161                 restObj = GBPRestangular.one('restconf').one('operations'),\r
2162                 rpcRes = 'pgn-application:create-or-replace-endpoint-groups',\r
2163                 reqData = {\r
2164                                "input": \r
2165                                 {\r
2166                                     "endpoint-group":[\r
2167                                     {\r
2168                                         "pgn-application:tenant-id": tenantID, \r
2169                                         "pgn-application:id":uuid,\r
2170                                         "pgn-application:security-group-tag":sgt,\r
2171                                         "pgn-application:name":groupName,\r
2172                                         "pgn-application:description":description\r
2173                                     }\r
2174                                 ]\r
2175                             }\r
2176                         };\r
2177 \r
2178             restObj.post(rpcRes, reqData).then(function(data) {\r
2179                 successCbk(data);\r
2180             }, function(res) {\r
2181                 errorCbk(res);\r
2182             });\r
2183         };\r
2184 \r
2185         s.deleteEndpointGroup = function(successCbk, errorCbk, uuid) {\r
2186             var tenantId = getId(idTypes.tenant),\r
2187                 restObj = GBPRestangular.one('restconf').one('operations'),\r
2188                 rpcRes = 'pgn-application:delete-endpoint-groups',\r
2189                 reqData = {\r
2190                             "input": {\r
2191                                 "endpoint-group":[\r
2192                                     {\r
2193                                         "pgn-application:tenant-id": tenantId, \r
2194                                         "pgn-application:id":uuid\r
2195                                     }\r
2196                                 ]\r
2197                             }\r
2198                         };\r
2199 \r
2200             restObj.post(rpcRes, reqData).then(function(data) {\r
2201                 successCbk(data);\r
2202             }, function(res) {\r
2203                 errorCbk(res);\r
2204             });\r
2205         };\r
2206 \r
2207         s.getActions = function(successCbk, errorCbk) {\r
2208             var tenantId = getId(idTypes.tenant),\r
2209                 pathActionId = getId(idTypes.pathAction),\r
2210                 accessActionId = getId(idTypes.accessAction),\r
2211                 restObj = GBPRestangular.one('restconf').one('config').one('policy:tenants',  tenantId).one('subject-feature-instances');\r
2212 \r
2213             restObj.get().then(function(data) {\r
2214                 successCbk(data); //TODO fill actions\r
2215             }, function(res) {\r
2216                 errorCbk(res);\r
2217             });\r
2218         };\r
2219 \r
2220         s.applyPolicy = function(successCbk, errorCbk, providerId, consumerId, pathSelRule, accessCtrlRule) {\r
2221             var restObj = GBPRestangular.one('restconf').one('operations'),\r
2222                 rpcRes = 'pgn-application:wire-endpoint-groups',\r
2223                 actionRefName = (pathSelRule ? pathSelRule : '') + (accessCtrlRule ? accessCtrlRule : ''),\r
2224                 reqData = {\r
2225                                "input": {\r
2226                                     "endpoint-group-pair-with-rules": {\r
2227                                         "pgn-application:provider-tenant-id": tenantID, \r
2228                                         "pgn-application:consumer-tenant-id": tenantID, \r
2229                                         "pgn-application:provider-group-id":providerId,\r
2230                                         "pgn-application:consumer-group-id":consumerId,\r
2231                                         "pgn-application:group-rule": [\r
2232                                             {\r
2233                                                 "action-ref": [pathSelRule, accessCtrlRule].map(function(r) {\r
2234                                                     return { "name":r };\r
2235                                                 }),\r
2236                                                 "name":actionRefName\r
2237                                             }\r
2238                                         ]\r
2239                                     }\r
2240                                 }\r
2241                             };\r
2242 \r
2243             restObj.post(rpcRes, reqData).then(function(data) {\r
2244                 successCbk(data); //TODO reload policies\r
2245             }, function(res) {\r
2246                 errorCbk(res);\r
2247             });\r
2248         };\r
2249 \r
2250         s.deletePolicy = function(successCbk, errorCbk, providerId, consumerId) {\r
2251             var tenantId = getId(idTypes.tenant),\r
2252                 restObj = GBPRestangular.one('restconf').one('operations'),\r
2253                 rpcRes = 'pgn-application:unwire-endpoint-groups',\r
2254                 reqData = {\r
2255                            "input": \r
2256                             {\r
2257                                 "endpoint-group-pair":[\r
2258                                     {\r
2259                                         "pgn-application:provider-tenant-id": tenantId, \r
2260                                         "pgn-application:consumer-tenant-id": tenantId, \r
2261                                         "pgn-application:provider-group-id":providerId,\r
2262                                         "pgn-application:consumer-group-id":consumerId\r
2263                                     }\r
2264                                 ]\r
2265                             }\r
2266                         };\r
2267 \r
2268             restObj.post(rpcRes, reqData).then(function(data) {\r
2269                 successCbk(data); //TODO reload policies\r
2270             }, function(res) {\r
2271                 errorCbk(res);\r
2272             });\r
2273         };\r
2274 \r
2275         s.addEndPoint = function(successCbk, errorCbk, ipAddress, groupId) {\r
2276             var l3ctxId = getId(idTypes.l3ctx),\r
2277                 tenantId = getId(idTypes.tenant),\r
2278                 restObj = GBPRestangular.one('restconf').one('operations'),\r
2279                 rpcRes = 'endpoint:register-endpoint',\r
2280                 reqData = {\r
2281                             "input": {\r
2282                                 "endpoint-group": groupId,\r
2283                                 "l3-address": [\r
2284                                     {\r
2285                                         "ip-address": ipAddress,\r
2286                                         "l3-context": l3ctxId\r
2287                                     }\r
2288                                 ],\r
2289                                 "tenant": tenantId\r
2290                             }\r
2291                         };\r
2292 \r
2293             restObj.post(rpcRes, reqData).then(function(data) {\r
2294                 successCbk(data);\r
2295             }, function(res) {\r
2296                 errorCbk(res);\r
2297             });\r
2298         };\r
2299 \r
2300         s.getUUIDnumber = function() {\r
2301             var d = new Date().getTime();\r
2302             return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {\r
2303                         var r = (d + Math.random()*16)%16 | 0;\r
2304                         d = Math.floor(d/16);\r
2305                         return (c=='x' ? r : (r&0x3|0x8)).toString(16);\r
2306                     });\r
2307         };\r
2308 \r
2309         return s;\r
2310     });\r
2311 \r
2312     gbp.register.factory('DesignGbpFactory', function(){\r
2313 \r
2314         var dvf = {};\r
2315 \r
2316         dvf.setMainClass = function(){\r
2317             if ( $('.gbpWrapper').length ) {\r
2318                 $('.gbpWrapper').closest('.col-xs-12').addClass('gbpGlobalWrapper');\r
2319               }\r
2320         };\r
2321 \r
2322         return dvf;\r
2323 \r
2324     });\r
2325 \r
2326     gbp.register.factory('JointGraphOffsetFactory', function(GBPConstants){\r
2327         var jgof = {};\r
2328 \r
2329         jgof.createWHObj = function(w, h) {\r
2330             return {w: w || 0, h: h || 0};\r
2331         };\r
2332 \r
2333         jgof.updateOffsets = function(delta, offset, margin, maximums, paper) {\r
2334             offset.w = offset.w + delta.w + margin.w;\r
2335 \r
2336             if(offset.w >= maximums.w) {\r
2337                 paper.setDimensions(offset.w + 30, paper.options.height);\r
2338                 offset.w = offset.ow;\r
2339                 offset.h = offset.h + margin.h;\r
2340             }\r
2341 \r
2342         };\r
2343 \r
2344         jgof.resetOffsets = function(offset, w, h) {\r
2345             offset.w = w;\r
2346             offset.h = h;\r
2347         };\r
2348 \r
2349         jgof.getCurrentOffset = function(array, type) {\r
2350             var max = 0;\r
2351             array.forEach(function(item){\r
2352                 max = item.attributes.position[type] > max ? item.attributes.position[type] : max;\r
2353             });\r
2354 \r
2355             return max;\r
2356         };\r
2357 \r
2358         jgof.checkObjsHoffsets = function(array, size, paper) {\r
2359             var lastPosY = 0,\r
2360                 addOffset = false,\r
2361                 cellBottomOffset = 80,\r
2362                 setItemPosition = function(item, type) {\r
2363                     while (item.attributes.position[type] < size + cellBottomOffset) {\r
2364                         item.translate(null, cellBottomOffset);\r
2365                     }\r
2366                 };\r
2367 \r
2368             array.forEach(function(item){\r
2369                 addOffset = (size + cellBottomOffset) >= item.attributes.position.y;\r
2370 \r
2371                 if ( addOffset ) {\r
2372                     setItemPosition(item, 'y');\r
2373                 }\r
2374 \r
2375                 if ( item.attributes.position.y + cellBottomOffset > paper.options.height ) {\r
2376                     paper.setDimensions(paper.options.width, paper.options.height + cellBottomOffset);\r
2377                 }\r
2378             });\r
2379         };\r
2380 \r
2381         return jgof;\r
2382     });\r
2383 \r
2384     gbp.register.factory('JointGraphFactory', function(GBPConstants){\r
2385         var defaulColor = 'blue';\r
2386 \r
2387         var jgf = {};\r
2388 \r
2389         jgf.getLabelLength = function(length) {\r
2390             return length * 10 > 200 ? 200 : length * 10;\r
2391         };\r
2392 \r
2393         jgf.createGraph = function() {\r
2394             var graph = new joint.dia.Graph();\r
2395 \r
2396             var paper = new joint.dia.Paper({\r
2397                 el: $('#graph'),\r
2398                 width: 1300,\r
2399                 height: 650,\r
2400                 model: graph,\r
2401                 gridSize: 1\r
2402             });\r
2403 \r
2404             return paper;\r
2405         };\r
2406 \r
2407         jgf.reloadGraph = function(graph) {\r
2408             graph.clear();\r
2409         };\r
2410 \r
2411         jgf.createElement = function(elementName, posx, posy, width, height, objectType, object, tooltip, bgcolor, titleName) {\r
2412             var setWidth = function(width) {\r
2413                 return width < GBPConstants.jointElements.minWidth ? GBPConstants.jointElements.minWidth : \r
2414                        width > GBPConstants.jointElements.maxWidth ? GBPConstants.jointElements.maxWidth : width;\r
2415             };\r
2416 \r
2417             var setHeight = function(height) {\r
2418                 return height < GBPConstants.jointElements.minHeight ? GBPConstants.jointElements.minHeight : \r
2419                        height > GBPConstants.jointElements.maxHeight ? GBPConstants.jointElements.maxHeight : height;\r
2420             };\r
2421 \r
2422             // joint.shapes.basic.Rect = joint.shapes.basic.Generic.extend({\r
2423             joint.shapes.html = {};\r
2424             joint.shapes.html.Element = joint.shapes.basic.Generic.extend({\r
2425 \r
2426                 markup: '<g class="rotatable"><g class="scalable"><rect/><title /></g><text class="text1"></text><text class="text2"></text><title /></g>',\r
2427                 \r
2428                 defaults: joint.util.deepSupplement({\r
2429                     type: 'html.Element',\r
2430                     attrs: {\r
2431                         'rect': { fill: bgcolor, stroke: 'black', 'follow-scale': true, width: 80, height: 40, cursor: 'pointer' },\r
2432                         '.text1': { ref: 'rect', 'ref-x': 0.5, 'ref-y': 0.3, 'y-alignment': 'middle', 'x-alignment': 'middle', cursor: 'pointer', 'font-weight' : 'bold'},\r
2433                         '.text2': { ref: 'rect', 'ref-x': 0.5, 'ref-y': 0.7, 'y-alignment': 'middle', 'x-alignment': 'middle', cursor: 'pointer'},\r
2434                         'title': {text: tooltip},\r
2435                     }\r
2436                     \r
2437                 }, joint.shapes.basic.Generic.prototype.defaults)\r
2438             });\r
2439 \r
2440             // joint.shapes.html.ElementView = joint.dia.ElementView.extend({\r
2441 \r
2442             //     template: [\r
2443             //         '<input class="html-element" type="text" value="'+elementName+'"/>',\r
2444             //         ''\r
2445             //     ].join(''),\r
2446 \r
2447             //     initialize: function() {\r
2448             //         _.bindAll(this, 'updateBox');\r
2449             //         joint.dia.ElementView.prototype.initialize.apply(this, arguments);\r
2450 \r
2451             //         this.$box = $(_.template(this.template)());\r
2452             //         // Prevent paper from handling pointerdown.\r
2453             //         this.$box.find('input,select').on('mousedown click', function(evt) { evt.stopPropagation(); });\r
2454             //         // This is an example of reacting on the input change and storing the input data in the cell model.\r
2455             //         this.$box.find('input').on('change', _.bind(function(evt) {\r
2456             //             this.model.set('input', $(evt.target).val());\r
2457             //         }, this));\r
2458             //         this.$box.find('button').on('click', _.bind(function(evt) {\r
2459             //             this.model.set('button', $('.divc').css('display','block'));\r
2460             //         }, this));\r
2461             //         // Update the box position whenever the underlying model changes.\r
2462             //         this.model.on('change', this.updateBox, this);\r
2463 \r
2464             //         this.updateBox();\r
2465             //     },\r
2466             //     render: function() {\r
2467             //         joint.dia.ElementView.prototype.render.apply(this, arguments);\r
2468             //         this.paper.$el.prepend(this.$box);\r
2469             //         this.updateBox();\r
2470             //         return this;\r
2471             //     },\r
2472             //     updateBox: function() {\r
2473             //         // Set the position and dimension of the box so that it covers the JointJS element.\r
2474             //         var bbox = this.model.getBBox();\r
2475             //         // Example of updating the HTML with a data stored in the cell model.\r
2476             //         this.$box.css({ width: bbox.width, height: bbox.height, left: bbox.x, top: bbox.y, transform: 'rotate(' + (this.model.get('angle') || 0) + 'deg)' });\r
2477             //     },\r
2478             //     removeBox: function(evt) {\r
2479             //         this.$box.remove();\r
2480             //     }\r
2481             // });\r
2482 \r
2483             elementName = elementName.length > 20 ? elementName.slice(0,20) + '...' : elementName;\r
2484             // width = width > 200 ? 200 : width;\r
2485 \r
2486             // return new joint.shapes.basic.Rect({\r
2487             return new joint.shapes.html.Element({\r
2488                 position: { x: posx || 0, y: posy || 0 },\r
2489                 size: { width: width ||  GBPConstants.jointElements.minWidth, height: height || GBPConstants.jointElements.minHeight },\r
2490                 attrs: { rect: { fill: bgcolor }, '.text1': { fill: 'black', text: titleName}, '.text2': { fill: 'black', text: elementName }},\r
2491                 objType: objectType,\r
2492                 objData: object\r
2493             });\r
2494         };\r
2495 \r
2496         jgf.transformElement = function(element, transformX, transformY) {\r
2497             return element.translate(transformX, transformY);\r
2498         };\r
2499 \r
2500         jgf.addItem = function(graph, item) {\r
2501             graph.addCells([item]);\r
2502         };\r
2503 \r
2504         jgf.addItemList = function(graph, listItem) {\r
2505             graph.addCells(listItem);\r
2506         };\r
2507 \r
2508         jgf.createLink = function(srcId, targetId, color) {\r
2509             color = color || defaulColor;\r
2510 \r
2511             var link = new joint.dia.Link({\r
2512                 source: { id: srcId },\r
2513                 target: { id: targetId }\r
2514             });\r
2515 \r
2516             link.attr({\r
2517                 '.connection': { stroke: color },\r
2518                 '.marker-target': { fill: color, d: 'M 10 0 L 0 5 L 10 10 z' }\r
2519             });\r
2520 \r
2521             return link;\r
2522         };\r
2523 \r
2524         return jgf;\r
2525     });\r
2526 });