blob: f900d98862d7c1c53ae38a54384220843737284a [file] [log] [blame]
Matteo Scandoloba678a92016-06-20 17:16:15 -07001/**
2 * © OpenCORD
3 *
4 * Visit http://guide.xosproject.org/devguide/addview/ for more information
5 *
6 * Created by teone on 6/22/16.
7 */
8
9(function () {
10 'use strict';
11
12 /**
13 * @ngdoc service
14 * @name xos.SlicesEncoder.serviceGrid
15 **/
16
17 angular.module('xos.serviceGrid')
18 .service('SlicesEncoder', function($q, _, Slices, SiteEncoder, ImageEncoder, NetworkEncoder){
19
20 this.buildTosca = (slices, toscaSpec, serviceName) => {
21 // store here the promise that will build the dependency structure
22 let dependency = {};
23
24 const d = $q.defer();
25 slices = _.reduce(slices, (obj, s) => {
26 obj[s.name] = {
27 type: 'tosca.nodes.Slice',
28 properties: {
29 network: s.network
30 },
31 requirements: [
32 // by default slices are connected to management network
33 {
34 management: {
35 node: 'management',
36 relationship: 'tosca.relationships.ConnectsToNetwork'
37 }
38 },
39 ]
40 };
41
42 if(angular.isDefined(serviceName)){
43 let service = {};
44 service[`${serviceName}_service`] = {
45 node: `service#${serviceName}`,
46 relationship: 'tosca.relationships.MemberOfService'
47 };
48 obj[s.name].requirements.push(service);
49 }
50
51 if(angular.isDefined(s.description)){
52 obj[s.name].description = s.description;
53 }
54
55 if(angular.isDefined(s.site)){
56 dependency[`${s.name}#site`] = SiteEncoder.buildTosca(s.site, toscaSpec);
57 }
58 if(angular.isDefined(s.default_image)){
59 dependency[`${s.name}#image`] = ImageEncoder.buildTosca(s.default_image, toscaSpec);
60 }
61 if(angular.isDefined(s.networks) && s.networks.length > 0){
62 dependency[`${s.name}#management`] = NetworkEncoder.getSliceNetworks(s, toscaSpec);
63 }
64
65 return obj;
66 }, {});
67
68 // if we have dependency wait for them
69 if(Object.keys(dependency).length > 0){
70
71 let relationMap = {
72 site: 'tosca.relationships.MemberOfSite',
73 image: 'tosca.relationships.DefaultImage'
74 };
75
76 // NOTE create a reference to the management network
77 toscaSpec.topology_template.node_templates['management'] = {
78 type: 'tosca.nodes.network.Network.XOS',
79 properties: {
80 'no-create': true,
81 'no-delete': true,
82 'no-update': true
83 }
84 };
85
86 $q.all(dependency)
87 .then(deps => {
88
89 for(let k of Object.keys(deps)){
90
91 // this is UGLY!!!
92 // we are passing the requirement type inside the object key
93 // in which the promise is stored.
94 // This let us build the requirements array
95 let [sliceName, requirementType] = k.split('#');
96
97 if(angular.isDefined(relationMap[requirementType])){
98
99 if(!slices[sliceName].requirements){
100 slices[sliceName].requirements = [];
101 }
102
103 let [tosca, resource] = deps[k];
104
105 let requirementObj = {};
106
107 let reqName;
108
109 // NOTE site have problem with prefixing
110 if(requirementType === 'site'){
111 reqName = resource.name;
112 }
113 else{
114 reqName = `${requirementType}#${resource.name}`;
115 }
116
117 requirementObj[requirementType] = {
118 node: reqName,
119 relationship: relationMap[requirementType]
120 };
121
122 slices[sliceName].requirements.push(requirementObj);
123
124 angular.extend(toscaSpec, tosca);
125 }
126
127 }
128 // here we add slices to tosca
129 angular.extend(toscaSpec.topology_template.node_templates, slices);
130 d.resolve(toscaSpec);
131 })
132 .catch(e => {
133 throw new Error(e);
134 });
135 }
136 //else resolve directly
137 else {
138 angular.extend(toscaSpec.topology_template.node_templates, slices);
139 d.resolve(toscaSpec);
140 }
141
142 return d.promise;
143 };
144
145 this.getServiceSlices = (service, toscaSpec) => {
146 const d = $q.defer();
147 Slices.query({service: service.id}).$promise
148 .then(slices => {
149 return this.buildTosca(slices, toscaSpec, service.name)
150 })
151 .then(slicesTosca => {
152 d.resolve(slicesTosca);
153 });
154
155 return d.promise;
156 };
157 });
158})();
159