1 define(['app/gbp/gbp.module', 'app/gbp/js/joint.clean.build'], function(gbp, joint) {
\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
9 gbp.register.factory('GBPConstants', function() {
\r
10 var c = { colors: {'graph' : {}}, strings: {}, jointElements: {}, objType: {}, numbers: {}};
\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
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
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
30 c.colors[c.strings.flood+'-'+c.strings.bridge] = '#6666FF';
\r
31 c.colors[c.strings.bridge+'-'+c.strings.l3ctx] = '#6666FF';
\r
33 c.colors[c.strings.subnet+'-'] = '#6666FF';
\r
35 c.colors['graph']['subject'] = '#FFFFD4';
\r
36 c.colors['graph']['cns'] = '#8EEDFF';
\r
37 c.colors['graph']['pns'] = '#FF9C9C';
\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
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
51 c.numbers.displayLabelLength = 40;
\r
56 gbp.register.factory('MockServices', function() {
\r
60 ms.mockTopoData = function() {
\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
67 'label': 'LABEL'+data,
\r
71 'color': GBPConstants.colors[GBPConstants.strings.sigmaTopoDefault]
\r
74 links = linkRaw.map(function(data) {
\r
77 source: 'n' + data[0],
\r
78 target: 'n' + data[1],
\r
79 color: GBPConstants.colors[GBPConstants.strings.sigmaTopoDefault]
\r
85 return {nodes: nodes, links: links};
\r
91 gbp.register.factory('TopologyDataLoaders', function(GBPRestangular, GBPConstants) {
\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
100 reqData.input['from-oper-data'] = {};
\r
103 restObj.post(rpcRes, reqData).then(function(data) {
\r
104 // console.info('got data', data.output);
\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
117 restObj.post(rpcRes, reqData).then(function(data) {
\r
118 successCbk(data); //set topology links
\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
131 "endpoint-group-id":[
\r
133 "pgn-application:tenant-id": tenantId
\r
139 restObj.post(rpcRes, reqData).then(function(data) {
\r
140 successCbk(data); //set topology nodes
\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
152 "tenant-id": tenantId,
\r
153 "endpoint-group-id":epgId
\r
157 restObj.post(rpcRes, reqData).then(function(data) {
\r
158 successCbk(data); //set topology nodes
\r
165 tdl.getEpgTopo = function(data){
\r
166 var epgData = data.output['endpoint-group-pair-with-subject'],
\r
169 setNode = function(obj){
\r
171 'id': 'n' + nodes.length,
\r
172 'label': obj.name || obj.id,
\r
175 'x': Math.random(),
\r
176 'y': Math.random(),
\r
177 'color': GBPConstants.colors[GBPConstants.strings.sigmaTopoDefault]
\r
180 nodes.push(nodeObj);
\r
183 setEdge = function(sourceId, destId, data) {
\r
185 'id': 'e' + edges.length,
\r
186 'source': sourceId,
\r
188 'color': GBPConstants.colors[GBPConstants.strings.sigmaTopoDefault],
\r
190 // 'type': 'curve',
\r
196 getObjByProp = function(val, prop, list) {
\r
197 return list.filter(function(i){
\r
198 return i[prop] === val;
\r
203 epgData.forEach(function(e){
\r
204 var cepgnId = null,
\r
207 if ( !getObjByProp(e['consumer-endpoint-group-id'],'name', nodes).length ) {
\r
210 name: e['consumer-endpoint-group-id']
\r
212 cepgnId = setNode(objCepg);
\r
214 cepgnId = getObjByProp(e['consumer-endpoint-group-id'],'name', nodes)[0].id;
\r
216 if ( !getObjByProp(e['provider-endpoint-group-id'],'name', nodes).length ) {
\r
219 name: e['provider-endpoint-group-id']
\r
221 pepgnId = setNode(objPepg);
\r
223 pepgnId = getObjByProp(e['provider-endpoint-group-id'],'name', nodes)[0].id;
\r
225 if ( cepgnId && pepgnId ) {
\r
226 setEdge(cepgnId, pepgnId, e['ui-subject']);
\r
238 tdl.getL2L3 = function(storage, tenantId, successCbk, errorCbk) {
\r
242 getL2L3Label = function(node) {
\r
243 return node.name || node.id;
\r
245 getSubnetLabel = function(node) {
\r
246 return node['ip-prefix'] || node.id;
\r
248 getNodeColor = function(src) {
\r
249 return GBPConstants.colors[src] || GBPConstants.colors[GBPConstants.strings.sigmaTopoDefault];
\r
251 getLinkColor = function(from, to) {
\r
252 return GBPConstants.colors[from+'-'+to] || GBPConstants.colors[GBPConstants.strings.sigmaTopoDefault];
\r
254 getNodes = function(data, srcDesc, getLabelCbk) {
\r
255 var nodes = data.map(function(elem) {
\r
258 'label': getLabelCbk(elem),
\r
261 'x': Math.random(),
\r
262 'y': Math.random(),
\r
263 'color': getNodeColor(srcDesc)
\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
279 var links = data.map(function(elem) {
\r
281 src = findByUUID(srcNodes, elem.id),
\r
282 trg = findByUUID(targetNodes, elem.parent);
\r
289 'color': getLinkColor(fromDesc, toDesc)
\r
295 }).filter(function(elem) {
\r
296 return elem !== null;
\r
302 restObj = GBPRestangular.one('restconf').one(storage).one('policy:tenants').one('tenant').one(tenantId);
\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
315 successCbk(allNodes, allLinks);
\r
317 errorCbk(res.data, res.status);
\r
321 tdl.getClassifierInstances = function() {
\r
328 gbp.register.factory('TopoServices', function(TopologyDataLoaders, MockServices, GBPConstants) {
\r
336 var transformPGNTopoNodes = function(data) {
\r
337 return data.output['endpoint-group'].map(function(d) {
\r
341 sgt: d['security-group-tag']
\r
346 var transformPGNTopoLinks = function(data) {
\r
347 return data.output['endpoint-group-pair-with-rules'].map(function(d) {
\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
359 'epg' : GBPConstants.colors[GBPConstants.strings.sigmaTopoDefault]
\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
374 loaders[GBPConstants.strings.empty] = function(successCbk, errorCbk) {
\r
375 successCbk([], []);
\r
378 loaders[GBPConstants.strings.config] = function(successCbk, errorCbk, args) {
\r
379 var storage = args.storage || 'config',
\r
380 tenantId = args.tenantId;
\r
383 TopologyDataLoaders.getSubjectsBetweenEndpointGroups(false, tenantId, function(data){
\r
384 var topo = TopologyDataLoaders.getEpgTopo(data);
\r
385 successCbk(topo.nodes, topo.links);
\r
390 loaders[GBPConstants.strings.oper] = function(successCbk, errorCbk, args) {
\r
391 var storage = args.storage || 'config',
\r
392 tenantId = args.tenantId;
\r
394 TopologyDataLoaders.getSubjectsBetweenEndpointGroups(true, tenantId, function(data){
\r
395 var topo = TopologyDataLoaders.getEpgTopo(data);
\r
396 successCbk(topo.nodes, topo.links);
\r
401 loaders[GBPConstants.strings.l2l3] = function(successCbk, errorCbk, args) {
\r
402 var storage = args.storage || 'config',
\r
403 tenantId = args.tenantId;
\r
405 if(storage && tenantId) {
\r
406 TopologyDataLoaders.getL2L3(storage, tenantId, successCbk, errorCbk);
\r
408 //different kind of error
\r
413 loaders[GBPConstants.strings.mock] = function(successCbk, errorCbk) {
\r
414 var data = MockServices.mockTopoData();
\r
415 successCbk(data.nodes, data.links);
\r
418 ts.getConsProvLabel = function(edge, topo){
\r
422 topo.nodes.forEach(function(n){
\r
424 if ( edge.source === n.id ) {
\r
428 if ( edge.target === n.id ) {
\r
433 return provName + ':' + conName;
\r
436 ts.getLegend = function(type) {
\r
437 if(type === null || legends.hasOwnProperty(type) === false) {
\r
438 type = GBPConstants.strings.empty;
\r
441 return legends[type];
\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
449 loaders[type](successCbk, errorCbk, args);
\r
455 gbp.register.factory('GPBServices', function(GBPRestangular) {
\r
459 s.getDefinitions = function(successCbk, errorCbk) {
\r
460 var restObj = GBPRestangular.one('restconf').one('operational').one('policy:subject-feature-definitions');
\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
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
484 s.createRestObj = function(storage) {
\r
485 storage = storage || 'config';
\r
486 restObj = GBPRestangular.one('restconf').one(storage);
\r
491 s.send = function(restObj, reqData, successCbk, errorCbk) {
\r
492 restObj.customPUT(reqData).then(function(data) {
\r
495 errorCbk(res.data, res.status);
\r
499 s.post = function(restObj, reqData, successCbk, errorCbk) {
\r
500 restObj.customPOST(reqData).then(function(data) {
\r
503 errorCbk(res.data, res.status);
\r
507 s.delete = function(restObj, successCbk, errorCbk) {
\r
508 restObj.remove().then(function(data) {
\r
511 errorCbk(res.data, res.status);
\r
515 s.load = function(restObj, transformCallback, successCbk, errorCbk) {
\r
516 restObj.get().then(function(data) {
\r
517 var objs = transformCallback(data) || [];
\r
520 errorCbk(res.data, res.status);
\r
524 s.stripNullValues = function(obj) {
\r
525 Object.keys(obj).forEach(function(k) {
\r
526 if(obj[k] === null) {
\r
534 s.removeEmptyElementsFromList = function(list) {
\r
535 return list.filter(function(e) {
\r
540 s.createParamObj = function(name, type, value) {
\r
541 var obj = { name: name };
\r
543 obj[type+'-value'] = value;
\r
548 s.getInstanceParamValue = function(param) {
\r
549 return param['int-value'] || param['string-value'] || param['range-value'];
\r
552 s.getDefinitionObjParams = function(defObj, id) {
\r
553 var obj = defObj.filter(function(def) {
\r
554 return def.id === id;
\r
556 params = (obj && obj.parameter) ? obj.parameter : [];
\r
562 s.getPropFromListByProp = function(list, propSrc, targetValue, propDst) {
\r
564 selectedObj = list.filter(function(e) {
\r
565 return e[propSrc] === targetValue;
\r
570 output = selectedObj[propDst];
\r
572 output = selectedObj;
\r
583 gbp.register.factory('GBPGovernanceServices', function(TopologyDataLoaders) {
\r
586 var subjectInList = function(subjectName, subjectList) {
\r
587 return subjectList.some(function(s) {
\r
588 return s.name === subjectName;
\r
592 var EPG = function(epgId, tenantId) {
\r
594 this.tenantId = tenantId;
\r
597 var Subject = function(name) {
\r
600 this.providers = [];
\r
601 this.consumers = [];
\r
603 this.addProvider = function(providingEpg) {
\r
604 if(this.providers.indexOf(providingEpg) === -1) {
\r
605 this.providers.push(providingEpg);
\r
609 this.addConsumer = function(consumingEpg) {
\r
610 if(this.consumers.indexOf(consumingEpg) === -1) {
\r
611 this.consumers.push(consumingEpg);
\r
615 this.addRule = function(rule, classifierInstances) {
\r
616 if(rule['classifier-ref'] && rule['classifier-ref'].length > 0) {
\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
628 this.rules.push(rule);
\r
632 var addEpg = function(epgList, epgId, tenantId) {
\r
633 var addedEpg = null;
\r
635 if(epgList.some(function(epg) {
\r
636 return epg.id === epgId && epg.tenantId === tenantId;
\r
638 addedEpg = new EPG(epgId, tenantId);
\r
641 if(addedEpg !== null) {
\r
642 epgList.push(addedEpg);
\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
652 newSubject = (existingSubject === undefined);
\r
655 existingSubject = new Subject(subject.name);
\r
658 existingSubject.addProvider(providerEpg);
\r
659 existingSubject.addConsumer(consumerEpg);
\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
668 subjects.push(existingSubject);
\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
675 pairData['ui-subject'].forEach(function(s) {
\r
676 addSubject(s, subjects, pairData['provider-endpoint-group-id'], pairData['consumer-endpoint-group-id'], classifierInstances);
\r
680 s.getEPGsAndSubjects = function(tenantId, classifierInstances, successCbk, errorCbk) {
\r
681 TopologyDataLoaders.getSubjectsBetweenEndpointGroups(false, tenantId,
\r
683 var epgPairs = data.output['endpoint-group-pair-with-subject'],
\r
689 epgPairs.forEach(function(p) {
\r
690 processPairData(providers, consumers, subjects, p, classifierInstances);
\r
694 successCbk({providers: providers, consumers: consumers, subjects: subjects});
\r
704 gbp.register.factory('GBPTenantServices', function(GPBServices) {
\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
714 var createBaseRestObj = function() {
\r
716 .createRestObj().one('policy:tenants');
\r
719 var createRestObj = function(pathObj) {
\r
720 return createBaseRestObj().one('tenant').one(pathObj.tenantId);
\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
727 return rawData.tenants.tenant;
\r
730 var createData = function(obj) {
\r
731 return { tenant : [ GPBServices.stripNullValues(obj) ] };
\r
734 s.createPathObj = function(tenantId) {
\r
740 s.createObj = function() {
\r
741 return new Tenant();
\r
744 s.send = function(path, obj, successCbk, errorCbk) {
\r
745 var restObj = createRestObj(path),
\r
746 reqData = createData(obj);
\r
748 GPBServices.send(restObj, reqData, successCbk, errorCbk);
\r
751 s.modify = function(path, obj, successCbk, errorCbk) {
\r
752 var restObj = createRestObj(path),
\r
753 reqData = createData(obj);
\r
755 GPBServices.send(restObj, reqData, successCbk, errorCbk);
\r
758 s.delete = function(path, successCbk, errorCbk) {
\r
759 var restObj = createRestObj(path);
\r
761 GPBServices.delete(restObj, successCbk, errorCbk);
\r
764 s.load = function(successCbk, errorCbk) {
\r
765 var restObj = createBaseRestObj();
\r
766 GPBServices.load(restObj, transformCallback, successCbk, errorCbk);
\r
773 gbp.register.factory('GBPContractServices', function(GPBServices) {
\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
783 var createBaseRestObj = function(pathObj) {
\r
784 return GPBServices.createRestObj().one('policy:tenants').one('tenant').one(pathObj.tenantId);
\r
787 var createRestObj = function(pathObj) {
\r
788 return createBaseRestObj(pathObj).one('contract').one(pathObj.contractId);
\r
791 var transformCallback = function(rawData) {
\r
792 // return rawData.map(function(rawObj){
\r
793 // return new Contract(rawObj.id, rawObj.description);
\r
795 return rawData.tenant[0].contract;
\r
798 var createData = function(obj) {
\r
799 return { contract : [ GPBServices.stripNullValues(obj) ] };
\r
802 s.createPathObj = function(tenantId, contractId) {
\r
804 tenantId: tenantId,
\r
805 contractId: contractId
\r
809 s.createObj = function() {
\r
810 return new Contract();
\r
813 s.send = function(path, obj, successCbk, errorCbk) {
\r
814 var restObj = createRestObj(path),
\r
815 reqData = createData(obj);
\r
817 GPBServices.send(restObj, reqData, successCbk, errorCbk);
\r
820 s.delete = function(path, successCbk, errorCbk) {
\r
821 var restObj = createRestObj(path);
\r
823 GPBServices.delete(restObj, successCbk, errorCbk);
\r
826 s.load = function(path, successCbk, errorCbk) {
\r
827 var restObj = createBaseRestObj(path);
\r
829 GPBServices.load(restObj, transformCallback, successCbk, errorCbk);
\r
836 gbp.register.factory('GBPClauseServices', function(GPBServices) {
\r
840 var Clause = function(name, subjectRefs) {
\r
841 this.name = name || null;
\r
842 this['subject-refs'] = subjectRefs || [];
\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
851 var createRestObj = function(pathObj) {
\r
852 return createBaseRestObj(pathObj).one('clause').one(pathObj.clauseId);
\r
855 var transformCallback = function(rawData) {
\r
857 clauseData = rawData.contract[0].clause;
\r
860 data = clauseData.map(function(elem) {
\r
861 if(elem.hasOwnProperty('subject-refs') === false) {
\r
862 elem['subject-refs'] = [];
\r
871 var createData = function(obj) {
\r
872 var o = GPBServices.stripNullValues(obj);
\r
874 if(o['subject-refs']) {
\r
875 o['subject-refs'] = GPBServices.removeEmptyElementsFromList(o['subject-refs']);
\r
878 return { clause : [ o ] };
\r
881 s.createPathObj = function(tenantId, contractId, clauseId) {
\r
883 tenantId: tenantId,
\r
884 contractId: contractId,
\r
889 s.createObj = function() {
\r
890 return new Clause();
\r
893 s.send = function(path, obj, successCbk, errorCbk) {
\r
894 var restObj = createRestObj(path),
\r
895 reqData = createData(obj);
\r
897 GPBServices.send(restObj, reqData, successCbk, errorCbk);
\r
900 s.delete = function(path, successCbk, errorCbk) {
\r
901 var restObj = createRestObj(path);
\r
903 GPBServices.delete(restObj, successCbk, errorCbk);
\r
906 s.load = function(path, successCbk, errorCbk) {
\r
907 var restObj = createBaseRestObj(path);
\r
909 GPBServices.load(restObj, transformCallback, successCbk, errorCbk);
\r
916 gbp.register.factory('GBPSubjectServices', function(GPBServices) {
\r
920 var Subject = function(name, order) {
\r
921 this.name = name || null;
\r
922 this.order = order || null;
\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
931 var createRestObj = function(pathObj) {
\r
932 return createBaseRestObj(pathObj).one('subject').one(pathObj.subjectId);
\r
935 var transformCallback = function(rawData) {
\r
936 // return rawData.map(function(rawObj){
\r
937 // return new Subject(rawObj.name, rawObj.order);
\r
939 return rawData.contract[0].subject;
\r
942 var createData = function(obj) {
\r
943 return { subject : [ GPBServices.stripNullValues(obj) ] };
\r
946 s.createPathObj = function(tenantId, contractId, subjectId) {
\r
948 tenantId: tenantId,
\r
949 contractId: contractId,
\r
950 subjectId: subjectId
\r
954 s.createObj = function() {
\r
955 return new Subject();
\r
958 s.send = function(path, obj, successCbk, errorCbk) {
\r
959 var restObj = createRestObj(path),
\r
960 reqData = createData(obj);
\r
962 GPBServices.send(restObj, reqData, successCbk, errorCbk);
\r
965 s.delete = function(path, successCbk, errorCbk) {
\r
966 var restObj = createRestObj(path);
\r
968 GPBServices.delete(restObj, successCbk, errorCbk);
\r
971 s.load = function(path, successCbk, errorCbk) {
\r
972 var restObj = createBaseRestObj(path);
\r
974 GPBServices.load(restObj, transformCallback, successCbk, errorCbk);
\r
981 gbp.register.factory('GBPRuleServices', function(GPBServices) {
\r
985 var Rule = function(name, order) {
\r
986 this.name = name || null;
\r
987 this.order = order || null;
\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
997 var createRestObj = function(pathObj) {
\r
998 return createBaseRestObj(pathObj).one('rule').one(pathObj.ruleId);
\r
1001 var transformCallback = function(rawData) {
\r
1002 // return rawData.map(function(rawObj){
\r
1003 // return new Rule(rawObj.name, rawObj.order);
\r
1005 return rawData.subject[0].rule;
\r
1008 var createData = function(obj) {
\r
1009 return { rule : [ GPBServices.stripNullValues(obj) ] };
\r
1012 s.createPathObj = function(tenantId, contractId, subjectId, ruleId) {
\r
1014 tenantId: tenantId,
\r
1015 contractId: contractId,
\r
1016 subjectId: subjectId,
\r
1021 s.createObj = function() {
\r
1022 return new Rule();
\r
1025 s.send = function(path, obj, successCbk, errorCbk) {
\r
1026 var restObj = createRestObj(path),
\r
1027 reqData = createData(obj);
\r
1029 GPBServices.send(restObj, reqData, successCbk, errorCbk);
\r
1032 s.delete = function(path, successCbk, errorCbk) {
\r
1033 var restObj = createRestObj(path);
\r
1035 GPBServices.delete(restObj, successCbk, errorCbk);
\r
1038 s.load = function(path, successCbk, errorCbk) {
\r
1039 var restObj = createBaseRestObj(path);
\r
1041 GPBServices.load(restObj, transformCallback, successCbk, errorCbk);
\r
1048 gbp.register.factory('GBPClassifierRefsServices', function(GPBServices) {
\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
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
1067 var createRestObj = function(pathObj) {
\r
1068 return createBaseRestObj(pathObj).one('classifier-ref').one(pathObj.classifierRefId);
\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
1075 return rawData.rule[0]['classifier-ref'];
\r
1078 var createData = function(obj) {
\r
1079 return { 'classifier-ref' : [ GPBServices.stripNullValues(obj) ] };
\r
1082 s.createPathObj = function(tenantId, contractId, subjectId, ruleId, classifierRefId) {
\r
1084 tenantId: tenantId,
\r
1085 contractId: contractId,
\r
1086 subjectId: subjectId,
\r
1088 classifierRefId: classifierRefId
\r
1092 s.createObj = function() {
\r
1093 return new ClassifierRef();
\r
1096 s.send = function(path, obj, successCbk, errorCbk) {
\r
1097 var restObj = createRestObj(path),
\r
1098 reqData = createData(obj);
\r
1100 GPBServices.send(restObj, reqData, successCbk, errorCbk);
\r
1103 s.delete = function(path, successCbk, errorCbk) {
\r
1104 var restObj = createRestObj(path);
\r
1106 GPBServices.delete(restObj, successCbk, errorCbk);
\r
1109 s.load = function(path, successCbk, errorCbk) {
\r
1110 var restObj = createBaseRestObj(path);
\r
1112 GPBServices.load(restObj, transformCallback, successCbk, errorCbk);
\r
1119 gbp.register.factory('GBPActionRefsServices', function(GPBServices) {
\r
1123 var ActionRef = function(name, order, instanceName) {
\r
1124 this.name = name || null;
\r
1125 this.order = order || null;
\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
1136 var createRestObj = function(pathObj) {
\r
1137 return createBaseRestObj(pathObj).one('action-ref').one(pathObj.actionRefId);
\r
1140 var transformCallback = function(rawData) {
\r
1141 // return rawData.map(function(rawObj){
\r
1142 // return new ActionRef(rawObj.name, rawObj.order);
\r
1144 return rawData.rule[0]['action-ref'];
\r
1147 var createData = function(obj) {
\r
1148 return { 'action-ref' : [ GPBServices.stripNullValues(obj) ] };
\r
1151 s.createPathObj = function(tenantId, contractId, subjectId, ruleId, actionRefId) {
\r
1153 tenantId: tenantId,
\r
1154 contractId: contractId,
\r
1155 subjectId: subjectId,
\r
1157 actionRefId: actionRefId
\r
1161 s.createObj = function() {
\r
1162 return new ActionRef();
\r
1165 s.send = function(path, obj, successCbk, errorCbk) {
\r
1166 var restObj = createRestObj(path),
\r
1167 reqData = createData(obj);
\r
1169 GPBServices.send(restObj, reqData, successCbk, errorCbk);
\r
1172 s.delete = function(path, successCbk, errorCbk) {
\r
1173 var restObj = createRestObj(path);
\r
1175 GPBServices.delete(restObj, successCbk, errorCbk);
\r
1178 s.load = function(path, successCbk, errorCbk) {
\r
1179 var restObj = createBaseRestObj(path);
\r
1181 GPBServices.load(restObj, transformCallback, successCbk, errorCbk);
\r
1188 gbp.register.factory('GBPL2FloodDomainServices', function(GPBServices) {
\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
1199 var createBaseRestObj = function(pathObj) {
\r
1200 return GPBServices.createRestObj()
\r
1201 .one('policy:tenants').one('tenant').one(pathObj.tenantId);
\r
1204 var createRestObj = function(pathObj) {
\r
1205 return createBaseRestObj(pathObj).one('l2-flood-domain').one(pathObj.l2FloodDomain);
\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
1212 return rawData.tenant[0]['l2-flood-domain'];
\r
1215 var createData = function(obj) {
\r
1216 return { 'l2-flood-domain' : [ GPBServices.stripNullValues(obj) ] };
\r
1219 s.createPathObj = function(tenantId, l2FloodDomain) {
\r
1221 tenantId: tenantId,
\r
1222 l2FloodDomain: l2FloodDomain
\r
1226 s.createObj = function() {
\r
1227 return new L2FloodDomain();
\r
1230 s.send = function(path, obj, successCbk, errorCbk) {
\r
1231 var restObj = createRestObj(path),
\r
1232 reqData = createData(obj);
\r
1234 GPBServices.send(restObj, reqData, successCbk, errorCbk);
\r
1237 s.delete = function(path, successCbk, errorCbk) {
\r
1238 var restObj = createRestObj(path);
\r
1240 GPBServices.delete(restObj, successCbk, errorCbk);
\r
1243 s.load = function(path, successCbk, errorCbk) {
\r
1244 var restObj = createBaseRestObj(path);
\r
1246 GPBServices.load(restObj, transformCallback, successCbk, errorCbk);
\r
1253 gbp.register.factory('GBPL2BridgeDomainServices', function(GPBServices) {
\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
1264 var createBaseRestObj = function(pathObj) {
\r
1265 return GPBServices.createRestObj()
\r
1266 .one('policy:tenants').one('tenant')
\r
1267 .one(pathObj.tenantId);
\r
1270 var createRestObj = function(pathObj) {
\r
1271 return createBaseRestObj(pathObj).one('l2-bridge-domain').one(pathObj.l2BridgeDomain);
\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
1278 return rawData.tenant[0]['l2-bridge-domain'];
\r
1281 var createData = function(obj) {
\r
1282 return { 'l2-bridge-domain' : [ GPBServices.stripNullValues(obj) ] };
\r
1285 s.createPathObj = function(tenantId, l2BridgeDomain) {
\r
1287 tenantId: tenantId,
\r
1288 l2BridgeDomain: l2BridgeDomain
\r
1292 s.createObj = function() {
\r
1293 return new L2BridgeDomain();
\r
1296 s.send = function(path, obj, successCbk, errorCbk) {
\r
1297 var restObj = createRestObj(path),
\r
1298 reqData = createData(obj);
\r
1300 GPBServices.send(restObj, reqData, successCbk, errorCbk);
\r
1303 s.delete = function(path, successCbk, errorCbk) {
\r
1304 var restObj = createRestObj(path);
\r
1306 GPBServices.delete(restObj, successCbk, errorCbk);
\r
1309 s.load = function(path, successCbk, errorCbk) {
\r
1310 var restObj = createBaseRestObj(path);
\r
1312 GPBServices.load(restObj, transformCallback, successCbk, errorCbk);
\r
1319 gbp.register.factory('GBPL3ContextServices', function(GPBServices) {
\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
1329 var createBaseRestObj = function(pathObj) {
\r
1330 return GPBServices.createRestObj()
\r
1331 .one('policy:tenants').one('tenant').one(pathObj.tenantId);
\r
1334 var createRestObj = function(pathObj) {
\r
1335 return createBaseRestObj(pathObj).one('l3-context').one(pathObj.l3Context);
\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
1342 return rawData.tenant[0]['l3-context'];
\r
1345 var createData = function(obj) {
\r
1346 return { 'l3-context' : [ GPBServices.stripNullValues(obj) ] };
\r
1349 s.createPathObj = function(tenantId, l3Context) {
\r
1351 tenantId: tenantId,
\r
1352 l3Context: l3Context
\r
1356 s.createObj = function() {
\r
1357 return new L3Context();
\r
1360 s.send = function(path, obj, successCbk, errorCbk) {
\r
1361 var restObj = createRestObj(path),
\r
1362 reqData = createData(obj);
\r
1364 GPBServices.send(restObj, reqData, successCbk, errorCbk);
\r
1367 s.delete = function(path, successCbk, errorCbk) {
\r
1368 var restObj = createRestObj(path);
\r
1370 GPBServices.delete(restObj, successCbk, errorCbk);
\r
1373 s.load = function(path, successCbk, errorCbk) {
\r
1374 var restObj = createBaseRestObj(path);
\r
1376 GPBServices.load(restObj, transformCallback, successCbk, errorCbk);
\r
1383 gbp.register.factory('GBPSubnetServices', function(GPBServices) {
\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
1396 var createBaseRestObj = function(pathObj) {
\r
1397 return GPBServices.createRestObj()
\r
1398 .one('policy:tenants').one('tenant').one(pathObj.tenantId);
\r
1401 var createRestObj = function(pathObj) {
\r
1402 return createBaseRestObj(pathObj).one('subnet').one(pathObj.subnet);
\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
1409 return rawData.tenant[0]['subnet'];
\r
1412 var createData = function(obj) {
\r
1413 return { 'subnet' : [ GPBServices.stripNullValues(obj) ] };
\r
1416 s.createPathObj = function(tenantId, subnet) {
\r
1418 tenantId: tenantId,
\r
1423 s.createObj = function() {
\r
1424 return new Subnet();
\r
1427 s.send = function(path, obj, successCbk, errorCbk) {
\r
1428 var restObj = createRestObj(path),
\r
1429 reqData = createData(obj);
\r
1431 GPBServices.send(restObj, reqData, successCbk, errorCbk);
\r
1434 s.delete = function(path, successCbk, errorCbk) {
\r
1435 var restObj = createRestObj(path);
\r
1437 GPBServices.delete(restObj, successCbk, errorCbk);
\r
1440 s.load = function(path, successCbk, errorCbk) {
\r
1441 var restObj = createBaseRestObj(path);
\r
1443 GPBServices.load(restObj, transformCallback, successCbk, errorCbk);
\r
1450 gbp.register.factory('GBPGatewayServices', function(GPBServices) {
\r
1454 var Gateway = function(gateway) {
\r
1455 this.gateway = gateway || null;
\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
1463 var createRestObj = function(pathObj) {
\r
1464 return createBaseRestObj(pathObj).one('gateways').one(pathObj.gateway);
\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
1471 return rawData.subnet[0]['gateways'];
\r
1474 var createData = function(obj) {
\r
1475 return { 'gateways' : [ GPBServices.stripNullValues(obj) ] };
\r
1478 s.createPathObj = function(tenantId, subnetId, gateway) {
\r
1480 tenantId: tenantId,
\r
1481 subnetId: subnetId,
\r
1486 s.createObj = function() {
\r
1487 return new Gateway();
\r
1490 s.send = function(path, obj, successCbk, errorCbk) {
\r
1491 var restObj = createRestObj(path),
\r
1492 reqData = createData(obj);
\r
1494 GPBServices.send(restObj, reqData, successCbk, errorCbk);
\r
1497 s.delete = function(path, successCbk, errorCbk) {
\r
1498 var restObj = createRestObj(path);
\r
1500 GPBServices.delete(restObj, successCbk, errorCbk);
\r
1503 s.load = function(path, successCbk, errorCbk) {
\r
1504 var restObj = createBaseRestObj(path);
\r
1506 GPBServices.load(restObj, transformCallback, successCbk, errorCbk);
\r
1513 gbp.register.factory('GBPPrefixServices', function(GPBServices) {
\r
1517 var Prefix = function(prefix) {
\r
1518 this.prefix = prefix || null;
\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
1526 var createRestObj = function(pathObj) {
\r
1527 return createBaseRestObj(pathObj).one('prefixes').one(pathObj.prefixId);
\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
1534 return rawData.gateways[0].prefixes;
\r
1537 var createData = function(obj) {
\r
1538 return { 'prefixes' : [ GPBServices.stripNullValues(obj) ] };
\r
1541 s.createPathObj = function(tenantId, subnetId, gatewayId, prefixId) {
\r
1543 tenantId: tenantId,
\r
1544 subnetId: subnetId,
\r
1545 gatewayId: gatewayId,
\r
1546 prefixId: prefixId ? prefixId.replace("/", "%2F") : prefixId
\r
1550 s.createObj = function() {
\r
1551 return new Prefix();
\r
1554 s.send = function(path, obj, successCbk, errorCbk) {
\r
1555 var restObj = createRestObj(path),
\r
1556 reqData = createData(obj);
\r
1558 GPBServices.send(restObj, reqData, successCbk, errorCbk);
\r
1561 s.delete = function(path, successCbk, errorCbk) {
\r
1562 var restObj = createRestObj(path);
\r
1564 GPBServices.delete(restObj, successCbk, errorCbk);
\r
1567 s.load = function(path, successCbk, errorCbk) {
\r
1568 var restObj = createBaseRestObj(path);
\r
1570 GPBServices.load(restObj, transformCallback, successCbk, errorCbk);
\r
1577 gbp.register.factory('GBPClassifierInstanceServices', function(GPBServices) {
\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
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
1592 var createRestObj = function(pathObj) {
\r
1593 return createBaseRestObj(pathObj).one('classifier-instance').one(pathObj.classfierInstanceId);
\r
1596 var transformCallback = function(rawData) {
\r
1597 return rawData['subject-feature-instances']['classifier-instance'];
\r
1600 var createData = function(obj) {
\r
1601 return { 'classifier-instance' : [ GPBServices.stripNullValues(obj) ] };
\r
1604 s.createPathObj = function(tenantId, classfierInstanceId) {
\r
1606 tenantId: tenantId,
\r
1607 classfierInstanceId: classfierInstanceId
\r
1611 s.createObj = function() {
\r
1612 return new ClassifierService();
\r
1615 s.send = function(path, obj, successCbk, errorCbk) {
\r
1616 var restObj = createRestObj(path),
\r
1617 reqData = createData(obj);
\r
1619 GPBServices.send(restObj, reqData, successCbk, errorCbk);
\r
1622 s.delete = function(path, successCbk, errorCbk) {
\r
1623 var restObj = createRestObj(path);
\r
1625 GPBServices.delete(restObj, successCbk, errorCbk);
\r
1628 s.load = function(path, successCbk, errorCbk) {
\r
1629 var restObj = createBaseRestObj(path);
\r
1631 GPBServices.load(restObj, transformCallback, successCbk, errorCbk);
\r
1638 gbp.register.factory('GBPActionInstanceServices', function(GPBServices) {
\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
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
1653 var createRestObj = function(pathObj) {
\r
1654 return createBaseRestObj(pathObj).one('action-instance').one(pathObj.actionInstanceId);
\r
1657 var transformCallback = function(rawData) {
\r
1658 return rawData['subject-feature-instances']['action-instance'];
\r
1661 var createData = function(obj) {
\r
1662 return { 'action-instance' : [ GPBServices.stripNullValues(obj) ] };
\r
1665 s.createPathObj = function(tenantId, actionInstanceId) {
\r
1667 tenantId: tenantId,
\r
1668 actionInstanceId: actionInstanceId
\r
1672 s.createObj = function() {
\r
1673 return new ActionService();
\r
1676 s.send = function(path, obj, successCbk, errorCbk) {
\r
1677 var restObj = createRestObj(path),
\r
1678 reqData = createData(obj);
\r
1680 GPBServices.send(restObj, reqData, successCbk, errorCbk);
\r
1683 s.delete = function(path, successCbk, errorCbk) {
\r
1684 var restObj = createRestObj(path);
\r
1686 GPBServices.delete(restObj, successCbk, errorCbk);
\r
1689 s.load = function(path, successCbk, errorCbk) {
\r
1690 var restObj = createBaseRestObj(path);
\r
1692 GPBServices.load(restObj, transformCallback, successCbk, errorCbk);
\r
1695 s.getDefinitions = function(successCbk, errorCbk) {
\r
1696 var restObj = GBPRestangular.one('restconf').one('operational').one('policy:subject-feature-definitions');
\r
1698 restObj.get().then(function(data) {
\r
1699 successCbk(data['subject-feature-definitions']['action-definition']);
\r
1700 }, function(res) {
\r
1709 gbp.register.factory('GBPEpgServices', function(GPBServices) {
\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
1722 var createBaseRestObj = function(pathObj) {
\r
1723 return GPBServices.createRestObj()
\r
1724 .one('policy:tenants').one('tenant').one(pathObj.tenantId);
\r
1727 var createRestObj = function(pathObj) {
\r
1728 return createBaseRestObj(pathObj).one('endpoint-group').one(pathObj.epgId);
\r
1731 var transformCallback = function(rawData) {
\r
1732 return rawData.tenant[0]['endpoint-group'];
\r
1735 var createData = function(obj) {
\r
1736 return { 'endpoint-group' : [ GPBServices.stripNullValues(obj) ] };
\r
1739 s.createPathObj = function(tenantId, epgId) {
\r
1741 tenantId: tenantId,
\r
1746 s.createObj = function() {
\r
1750 s.send = function(path, obj, successCbk, errorCbk) {
\r
1751 var restObj = createRestObj(path),
\r
1752 reqData = createData(obj);
\r
1754 GPBServices.send(restObj, reqData, successCbk, errorCbk);
\r
1757 s.delete = function(path, successCbk, errorCbk) {
\r
1758 var restObj = createRestObj(path);
\r
1760 GPBServices.delete(restObj, successCbk, errorCbk);
\r
1763 s.load = function(path, successCbk, errorCbk) {
\r
1764 var restObj = createBaseRestObj(path);
\r
1766 GPBServices.load(restObj, transformCallback, successCbk, errorCbk);
\r
1773 gbp.register.factory('GBPConNamedSelServices', function(GPBServices) {
\r
1777 var ConsumerNamedSelector = function(name, contract) {
\r
1778 this.name = name || null;
\r
1779 this.contract = contract || [];
\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
1787 var createRestObj = function(pathObj) {
\r
1788 return createBaseRestObj(pathObj).one('consumer-named-selector').one(pathObj.cnsId);
\r
1791 var transformCallback = function(rawData) {
\r
1793 consumerData = rawData['endpoint-group'][0]['consumer-named-selector'];
\r
1795 if(consumerData) {
\r
1796 data = consumerData.map(function(elem) {
\r
1797 if(elem.hasOwnProperty('contract') === false) {
\r
1798 elem.contract = [];
\r
1807 var createData = function(obj) {
\r
1808 var o = GPBServices.stripNullValues(obj);
\r
1811 o.contract = GPBServices.removeEmptyElementsFromList(o.contract);
\r
1814 return { 'consumer-named-selector' : [ o ] };
\r
1817 s.createPathObj = function(tenantId, epgId, cnsId) {
\r
1819 tenantId: tenantId,
\r
1825 s.createObj = function() {
\r
1826 return new ConsumerNamedSelector();
\r
1829 s.send = function(path, obj, successCbk, errorCbk) {
\r
1830 var restObj = createRestObj(path),
\r
1831 reqData = createData(obj);
\r
1833 GPBServices.send(restObj, reqData, successCbk, errorCbk);
\r
1836 s.delete = function(path, successCbk, errorCbk) {
\r
1837 var restObj = createRestObj(path);
\r
1839 GPBServices.delete(restObj, successCbk, errorCbk);
\r
1842 s.load = function(path, successCbk, errorCbk) {
\r
1843 var restObj = createBaseRestObj(path);
\r
1845 GPBServices.load(restObj, transformCallback, successCbk, errorCbk);
\r
1853 gbp.register.factory('GBPProNamedSelServices', function(GPBServices) {
\r
1857 var ProviderNamedSelector = function(name, contract) {
\r
1858 this.name = name || null;
\r
1859 this.contract = contract || [];
\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
1867 var createRestObj = function(pathObj) {
\r
1868 return createBaseRestObj(pathObj).one('provider-named-selector').one(pathObj.cnsId);
\r
1871 var transformCallback = function(rawData) {
\r
1873 provderData = rawData['endpoint-group'][0]['provider-named-selector'];
\r
1876 data = provderData.map(function(elem) {
\r
1877 if(elem.hasOwnProperty('contract') === false) {
\r
1878 elem.contract = [];
\r
1887 var createData = function(obj) {
\r
1888 var o = GPBServices.stripNullValues(obj);
\r
1891 o.contract = GPBServices.removeEmptyElementsFromList(o.contract);
\r
1894 return { 'provider-named-selector' : [ o ] };
\r
1897 s.createPathObj = function(tenantId, epgId, cnsId) {
\r
1899 tenantId: tenantId,
\r
1905 s.createObj = function() {
\r
1906 return new ProviderNamedSelector();
\r
1909 s.send = function(path, obj, successCbk, errorCbk) {
\r
1910 var restObj = createRestObj(path),
\r
1911 reqData = createData(obj);
\r
1913 GPBServices.send(restObj, reqData, successCbk, errorCbk);
\r
1916 s.delete = function(path, successCbk, errorCbk) {
\r
1917 var restObj = createRestObj(path);
\r
1919 GPBServices.delete(restObj, successCbk, errorCbk);
\r
1922 s.load = function(path, successCbk, errorCbk) {
\r
1923 var restObj = createBaseRestObj(path);
\r
1925 GPBServices.load(restObj, transformCallback, successCbk, errorCbk);
\r
1932 gbp.register.factory('GBPEndpointServices', function(GPBServices) {
\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
1947 var createRestObj = function() {
\r
1948 return GPBServices.createRestObj('operations');
\r
1951 var transformCallback = function(rawData) {
\r
1952 return rawData.endpoints.endpoint;
\r
1955 var createBaseData = function(obj) {
\r
1956 var o = GPBServices.stripNullValues(obj);
\r
1959 o.condition = GPBServices.removeEmptyElementsFromList(o.condition);
\r
1962 if(o['endpoint-groups']) {
\r
1963 o['endpoint-groups'] = GPBServices.removeEmptyElementsFromList(o['endpoint-groups']);
\r
1966 if(o['l3-address']) {
\r
1967 o['l3-address'] = GPBServices.removeEmptyElementsFromList(o['l3-address']);
\r
1973 var createSendData = function(obj) {
\r
1974 var o = createBaseData(obj);
\r
1975 return { 'input': o };
\r
1978 var createDeleteData = function(obj) {
\r
1981 'l3': obj['l3-address'],
\r
1984 'l2-context': obj['l2-context'],
\r
1985 'mac-address': obj['mac-address']
\r
1994 s.createObj = function(tenantId) {
\r
1995 return new Endpoint(tenantId);
\r
1998 s.send = function(path, obj, successCbk, errorCbk) {
\r
1999 var restObj = createRestObj().one('endpoint:register-endpoint'),
\r
2000 reqData = createSendData(obj);
\r
2002 GPBServices.post(restObj, reqData, successCbk, errorCbk);
\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
2011 s.load = function(path, successCbk, errorCbk) {
\r
2012 var restObj = GPBServices.createRestObj('operational').one('endpoint:endpoints');
\r
2014 GPBServices.load(restObj, transformCallback, successCbk, errorCbk);
\r
2021 gbp.register.factory('GBPEndpointL3Services', function(GPBServices) {
\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
2036 var createRestObj = function() {
\r
2037 return GPBServices.createRestObj('operations');
\r
2040 var transformCallback = function(rawData) {
\r
2041 return rawData.endpoints['endpoint-l3-prefix'];
\r
2044 var createBaseData = function(obj) {
\r
2045 var o = GPBServices.stripNullValues(obj);
\r
2048 o.condition = GPBServices.removeEmptyElementsFromList(o.condition);
\r
2051 if(o['endpoint-groups']) {
\r
2052 o['endpoint-groups'] = GPBServices.removeEmptyElementsFromList(o['endpoint-groups']);
\r
2055 if(o['endpoint-l2-gateways']) {
\r
2056 o['endpoint-l2-gateways'] = GPBServices.removeEmptyElementsFromList(o['endpoint-l2-gateways']);
\r
2059 if(o['endpoint-l3-gateways']) {
\r
2060 o['endpoint-l3-gateways'] = GPBServices.removeEmptyElementsFromList(o['endpoint-l3-gateways']);
\r
2066 var createSendData = function(obj) {
\r
2067 var o = createBaseData(obj);
\r
2068 return { 'input': o };
\r
2071 var createDeleteData = function(obj) {
\r
2076 'l3-context': obj['l3-context'],
\r
2077 'ip-prefix': obj['ip-prefix']
\r
2080 'l2': obj['endpoint-l2-gateways'],
\r
2081 'l3': obj['endpoint-l3-gateways']
\r
2088 s.createObj = function(tenantId) {
\r
2089 return new EndpointL3(tenantId);
\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
2096 GPBServices.post(restObj, reqData, successCbk, errorCbk);
\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
2103 GPBServices.post(restObj, reqData, successCbk, errorCbk);
\r
2106 s.load = function(path, successCbk, errorCbk) {
\r
2107 var restObj = GPBServices.createRestObj('operational').one('endpoint:endpoints');
\r
2109 GPBServices.load(restObj, transformCallback, successCbk, errorCbk);
\r
2116 gbp.register.factory('PGNServices', function(GBPRestangular) {
\r
2120 var idGetter = {};
\r
2126 pathAction: 'PATHACTION',
\r
2127 accessAction: 'ACCESSACTION'
\r
2130 idGetter[idTypes.tenant] = function() {
\r
2134 idGetter[idTypes.uuid] = function() {
\r
2138 idGetter[idTypes.l3ctx] = function() {
\r
2142 idGetter[idTypes.pathAction] = function() {
\r
2146 idGetter[idTypes.accessAction] = function() {
\r
2150 var getId = function(type) {
\r
2151 if(idGetter.hasOwnProperty(type)) {
\r
2152 return id = idGetter[type]();
\r
2154 throw "Cannot get idGetter for type " + type;
\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
2166 "endpoint-group":[
\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
2178 restObj.post(rpcRes, reqData).then(function(data) {
\r
2180 }, function(res) {
\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
2191 "endpoint-group":[
\r
2193 "pgn-application:tenant-id": tenantId,
\r
2194 "pgn-application:id":uuid
\r
2200 restObj.post(rpcRes, reqData).then(function(data) {
\r
2202 }, function(res) {
\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
2213 restObj.get().then(function(data) {
\r
2214 successCbk(data); //TODO fill actions
\r
2215 }, function(res) {
\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
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
2233 "action-ref": [pathSelRule, accessCtrlRule].map(function(r) {
\r
2234 return { "name":r };
\r
2236 "name":actionRefName
\r
2243 restObj.post(rpcRes, reqData).then(function(data) {
\r
2244 successCbk(data); //TODO reload policies
\r
2245 }, function(res) {
\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
2257 "endpoint-group-pair":[
\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
2268 restObj.post(rpcRes, reqData).then(function(data) {
\r
2269 successCbk(data); //TODO reload policies
\r
2270 }, function(res) {
\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
2282 "endpoint-group": groupId,
\r
2285 "ip-address": ipAddress,
\r
2286 "l3-context": l3ctxId
\r
2289 "tenant": tenantId
\r
2293 restObj.post(rpcRes, reqData).then(function(data) {
\r
2295 }, function(res) {
\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
2312 gbp.register.factory('DesignGbpFactory', function(){
\r
2316 dvf.setMainClass = function(){
\r
2317 if ( $('.gbpWrapper').length ) {
\r
2318 $('.gbpWrapper').closest('.col-xs-12').addClass('gbpGlobalWrapper');
\r
2326 gbp.register.factory('JointGraphOffsetFactory', function(GBPConstants){
\r
2329 jgof.createWHObj = function(w, h) {
\r
2330 return {w: w || 0, h: h || 0};
\r
2333 jgof.updateOffsets = function(delta, offset, margin, maximums, paper) {
\r
2334 offset.w = offset.w + delta.w + margin.w;
\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
2344 jgof.resetOffsets = function(offset, w, h) {
\r
2349 jgof.getCurrentOffset = function(array, type) {
\r
2351 array.forEach(function(item){
\r
2352 max = item.attributes.position[type] > max ? item.attributes.position[type] : max;
\r
2358 jgof.checkObjsHoffsets = function(array, size, paper) {
\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
2368 array.forEach(function(item){
\r
2369 addOffset = (size + cellBottomOffset) >= item.attributes.position.y;
\r
2371 if ( addOffset ) {
\r
2372 setItemPosition(item, 'y');
\r
2375 if ( item.attributes.position.y + cellBottomOffset > paper.options.height ) {
\r
2376 paper.setDimensions(paper.options.width, paper.options.height + cellBottomOffset);
\r
2384 gbp.register.factory('JointGraphFactory', function(GBPConstants){
\r
2385 var defaulColor = 'blue';
\r
2389 jgf.getLabelLength = function(length) {
\r
2390 return length * 10 > 200 ? 200 : length * 10;
\r
2393 jgf.createGraph = function() {
\r
2394 var graph = new joint.dia.Graph();
\r
2396 var paper = new joint.dia.Paper({
\r
2407 jgf.reloadGraph = function(graph) {
\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
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
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
2426 markup: '<g class="rotatable"><g class="scalable"><rect/><title /></g><text class="text1"></text><text class="text2"></text><title /></g>',
\r
2428 defaults: joint.util.deepSupplement({
\r
2429 type: 'html.Element',
\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
2437 }, joint.shapes.basic.Generic.prototype.defaults)
\r
2440 // joint.shapes.html.ElementView = joint.dia.ElementView.extend({
\r
2443 // '<input class="html-element" type="text" value="'+elementName+'"/>',
\r
2447 // initialize: function() {
\r
2448 // _.bindAll(this, 'updateBox');
\r
2449 // joint.dia.ElementView.prototype.initialize.apply(this, arguments);
\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
2458 // this.$box.find('button').on('click', _.bind(function(evt) {
\r
2459 // this.model.set('button', $('.divc').css('display','block'));
\r
2461 // // Update the box position whenever the underlying model changes.
\r
2462 // this.model.on('change', this.updateBox, this);
\r
2464 // this.updateBox();
\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
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
2478 // removeBox: function(evt) {
\r
2479 // this.$box.remove();
\r
2483 elementName = elementName.length > 20 ? elementName.slice(0,20) + '...' : elementName;
\r
2484 // width = width > 200 ? 200 : width;
\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
2496 jgf.transformElement = function(element, transformX, transformY) {
\r
2497 return element.translate(transformX, transformY);
\r
2500 jgf.addItem = function(graph, item) {
\r
2501 graph.addCells([item]);
\r
2504 jgf.addItemList = function(graph, listItem) {
\r
2505 graph.addCells(listItem);
\r
2508 jgf.createLink = function(srcId, targetId, color) {
\r
2509 color = color || defaulColor;
\r
2511 var link = new joint.dia.Link({
\r
2512 source: { id: srcId },
\r
2513 target: { id: targetId }
\r
2517 '.connection': { stroke: color },
\r
2518 '.marker-target': { fill: color, d: 'M 10 0 L 0 5 L 10 10 z' }
\r