Removed rift ro-account as a default ro account option
[osm/UI.git] / skyquake / plugins / launchpad / src / instantiate / instantiateStore.js
1 /*
2 *
3 * Copyright 2016 RIFT.IO Inc
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 *
17 */
18 import NetworkServiceActions from './launchNetworkServiceActions.js';
19 import NetworkServiceSource from './launchNetworkServiceSource.js';
20 import GUID from 'utils/guid.js';
21 import AppHeaderActions from 'widgets/header/headerActions.js';
22 import Alt from '../alt';
23 import _cloneDeep from 'lodash/cloneDeep';
24 import _find from 'lodash/find';
25 import _merge from 'lodash/merge';
26
27 class LaunchNetworkServiceStore {
28 constructor() {
29 this.nsd = [];
30 this.nsdDict = {};
31 this.vnfd = [];
32 this.pnfd = [];
33 this.vld = [];
34 this.name = "";
35 this.ipProfiles = [];
36 this.dnsServers = [];
37 this.sshKeysList = [];
38 this.sshKeysRef = [];
39 this.sla_parameters = [];
40 this.selectedNSDid;
41 this.selectedNSD = {};
42 this.dataCenters = [];
43 this.isLoading = false;
44 this.hasConfigureNSD = false;
45 this.hasConfigureVNFD = false;
46 this['input-parameters'] = [];
47 this.displayPlacementGroups = true;
48 this.bindActions(NetworkServiceActions);
49 this.nsdConfiguration = {
50 name:'',
51 dataCenterID: null
52 };
53 /*Collection of vnf state containting cloud account and datacenter info.
54 keyed off vnfd-id-ref
55 */
56 this.usersList = [];
57 this.configAgentAccounts = [];
58
59 this.isPreviewing = false;
60 this.isOpenMano = false;
61
62 this.displayVIMAccounts = false;
63 this.resourceOrchestrators = [{
64 name: 'openmano',
65 'ro-account-type': 'openmano'
66 }];
67 this.selectedResourceOrchestrator = this.resourceOrchestrators[0];
68 this.dataCenterID = null;
69 this.vnfDataCenters = {};
70 this.registerAsync(NetworkServiceSource);
71 this.exportPublicMethods({
72 getMockData: getMockData.bind(this),
73 getMockSLA: getMockSLA.bind(this),
74 saveNetworkServiceRecord: this.saveNetworkServiceRecord,
75 nsFn: this.nsFn,
76 vnfFn: this.vnfFn,
77 updateInputParam: this.updateInputParam,
78 resetView: this.resetView,
79 nameUpdated: this.nameUpdated,
80 //nspg
81 descriptorSelected: this.descriptorSelected.bind(this),
82 deselectDescriptor: this.deselectDescriptor,
83 previewDescriptor: this.previewDescriptor,
84 vldFn: this.vldFn,
85 ipProfileFn: this.ipProfileFn,
86 dnsFn: this.dnsFn,
87 usersFn: this.usersFn,
88 sshFn: this.sshFn
89 });
90 }
91
92 //
93 resetView = () => {
94 console.log('reseting state');
95 this.setState({
96 name: '',
97 'input-parameter-xpath': null,
98 'ns-placement-groups': null,
99 'vnf-placement-groups':null
100 })
101 }
102
103
104 //Action Handlers
105 getCatalogSuccess(catalogs) {
106 let self = this;
107 let nsdDict = {};
108 let nsd = [];
109 let vnfd = [];
110 let pnfd = [];
111 catalogs.forEach(function(catalog) {
112 switch (catalog.type) {
113 case "nsd":
114 nsd.push(catalog);
115 try {
116 self.descriptorSelected(catalog.descriptors[0])
117 } catch (e) {
118 console.log('unable to select catalog')
119 }
120 break;
121 case "vnfd":
122 vnfd.push(catalog);
123 break;
124 case "pnfd":
125 pnfd.push(catalog);
126 break;
127 }
128 });
129 nsd[0].descriptors.map(function(n) {
130 nsdDict[n.id] = n;
131 })
132 this.setState({
133 nsd, vnfd, pnfd, nsdDict,
134
135 });
136 }
137 getConfigAgentSuccess(configAgentAccounts) {
138 this.setState({
139 configAgentAccounts: configAgentAccounts
140 })
141 }
142 getDataCentersSuccess(data) {
143 let dataCenters = data;
144
145 let newState = {
146 dataCenters: dataCenters || []
147 };
148 if (this.ro && this.ro['account-type'] == 'openmano') {
149 newState.dataCenterID = dataCenters[this.ro.name][0].uuid
150 }
151 this.setState(newState)
152 }
153 getVDUSuccess(VNFD) {
154 this.setState({
155 sla_parameters: VNFD
156 })
157 }
158 launchNSRLoading() {
159 Alt.actions.global.showScreenLoader.defer();
160 this.setState({
161 isLoading: true
162 });
163 console.log('is Loading', this)
164 }
165 launchNSRSuccess(data) {
166 console.log('Launching Network Service')
167 let tokenizedHash = window.location.hash.split('/');
168 Alt.actions.global.hideScreenLoader.defer();
169 this.setState({
170 isLoading: false
171 });
172 return window.location.hash = 'launchpad/' + tokenizedHash[2];
173 }
174 launchNSRError(data) {
175 Alt.actions.global.showNotification.defer(data);
176 Alt.actions.global.hideScreenLoader.defer();
177 this.setState({
178 isLoading: false
179 });
180 }
181 getInstantiateSshKeySuccess = (data) => {
182 this.setState({
183 sshKeysList: data,
184 sshKeysRef: []
185 })
186 }
187 getResourceOrchestratorAccountsSuccess = (data) => {
188 let self = this;
189 Alt.actions.global.hideScreenLoader.defer();
190 let ROAccounts = [];
191 this.setState({
192 resourceOrchestrators: ROAccounts.concat(data),
193 selectedResourceOrchestrator: data[0],
194 dataCenterID: data && data[0] && data[0].datacenters && data[0].datacenters.datacenters && data[0].datacenters.datacenters[0] && data[0].datacenters.datacenters[0].name,
195 dataCenterType: data && data[0] && data[0].datacenters && data[0].datacenters.datacenters && data[0].datacenters.datacenters[0] && data[0].datacenters.datacenters[0]['datacenter-type'],
196 displayVIMAccounts: false
197 })
198 }
199 getResourceOrchestratorError = (data) => {
200 console.log('getResourceOrchestrator Error: ', data)
201 }
202 //Form handlers
203 nameUpdated = (e) => {
204 this.setState({
205 name: e.target.value
206 })
207 }
208 deselectDescriptor = () => {
209 console.log('deselecting')
210 this.setState({
211 selectedNSDid: null,
212 selectedNSD: {},
213 isPreviewing: false
214 })
215 }
216 descriptorSelected = (data) => {
217 let NSD = data;
218 let VNFIDs = [];
219 this.resetView();
220 let newState = {
221 selectedNSDid: NSD.id,
222 vld: NSD && NSD.vld && NSD.vld.map(function(v) {
223 //Adding a type for UI state management
224 //This is deleted before launch
225 if(v['ip-profile-ref']) {
226 v.type = 'ip-profile-ref';
227 } else {
228 if(v['vim-network-name']) {
229 v.type = 'vim-network-name';
230 } else {
231 v.type = 'none';
232 }
233 }
234 return v;
235 }),
236 ipProfiles: NSD['ip-profiles']
237 };
238 newState.selectedNSD = data;
239 newState['input-parameters'] = [];
240 newState['vnf-input-parameter'] = [];
241 if (NSD['input-parameter-xpath']) {
242 let vnfParameters = [];
243 newState.hasConfigureNSD = true;
244 NSD['input-parameter-xpath'].map(function(p) {
245 if (isVNFDInputParameter(p)) {
246 newState.hasConfigureVNFD = true;
247 vnfParameters.push(p);
248 } else {
249 newState.hasConfigureNSD = true;
250 newState['input-parameters'].push(p);
251 }
252 })
253 newState['vnf-input-parameter'] = NSD['constituent-vnfd'].map(function(vnf) {
254 return {
255 'name': vnf['vnf-name'],
256 'member-vnf-index-ref': vnf['member-vnf-index'],
257 'vnfd-id-ref': vnf['vnfd-id-ref'],
258 'input-parameter':_cloneDeep(vnfParameters)
259 }
260 })
261 } else {
262 newState.hasConfigureNSD = false;
263 newState['input-parameter'] = null;
264 }
265 if(NSD['ns-placement-groups'] && NSD['ns-placement-groups'].length > 0 ) {
266 newState['ns-placement-groups'] = NSD['ns-placement-groups'];
267 }
268 if(NSD['vnf-placement-groups'] && NSD['vnf-placement-groups'].length > 0 ) {
269 newState['vnf-placement-groups'] = NSD['vnf-placement-groups'];
270 }
271 NSD["constituent-vnfd"] && NSD["constituent-vnfd"].map((v) => {
272 VNFIDs.push(v["vnfd-id-ref"]);
273 })
274 this.getInstance().getVDU(VNFIDs);
275 this.setState(newState);
276
277 function isVNFDInputParameter(p){
278 return p.xpath.match('vnfd-catalog');
279 }
280 }
281 previewDescriptor = (data) => {
282 let self = this;
283 return function(e) {
284 self.setState({
285 isPreviewing: true,
286 selectedNSD: data
287 })
288 }
289 }
290 updateInputParam = (i, value) => {
291 let ip = this['input-parameters'];
292 ip[i].value = value;
293 this.setState({
294 'input-parameters': ip
295 });
296 }
297 updateVnfInputParam = (i, j, value) => {
298 let ip = this['vnf-input-parameter'];
299 ip[i]['input-parameter'][j].value = value;
300 this.setState({
301 'vnf-input-parameter': ip
302 });
303 }
304 nsFn = () => {
305 let self = this;
306 return {
307 updateSelectedRoAccount: (resourceOrchestrator) => {
308 let nsd = self.nsd[0];
309 var newState = {
310 selectedResourceOrchestrator: JSON.parse(JSON.parse(resourceOrchestrator.target.value))
311 };
312 // if no datacenters and ro is not rift-ro
313 if (!(newState.selectedResourceOrchestrator.datacenters && newState.selectedResourceOrchestrator.datacenters.datacenters) ) {
314 Alt.actions.global.showNotification.defer("No data centers configured in resource orchestrator");
315 } else {
316 newState.dataCenterID = newState.selectedResourceOrchestrator.datacenters.datacenters[0].name;
317 newState.dataCenterType = newState.selectedResourceOrchestrator.datacenters.datacenters[0]['datacenter-type'];
318 newState.displayPlacementGroups = newState.selectedResourceOrchestrator.name == "rift" ? true : false;
319 }
320 self.setState(newState);
321 },
322 updateSelectedDataCenter: (dataCenter) => {
323 let dataCenterID = JSON.parse(JSON.parse(dataCenter.target.value));
324 let dataCenterType = _find(self.selectedResourceOrchestrator.datacenters.datacenters, {name: dataCenterID})
325
326 self.setState({
327 dataCenterID,
328 dataCenterType
329 });
330 },
331 placementGroupUpdate: (i, k, event) => {
332 let value = event.target.value;
333 let pg = self['ns-placement-groups'];
334 pg[i][k] = value;
335 self.setState({
336 'ns-placement-groups': pg
337 })
338 },
339 hostAggregateUpdate: (pgi, hai, k, event) => {
340 let value = event.target.value;
341 let pg = self['ns-placement-groups'];
342 let ha = pg[pgi]['host-aggregate'][hai];
343 ha[k] = value;
344 self.setState({
345 'ns-placement-groups': pg
346 })
347 },
348 addHostAggregate: (pgi) => {
349 let pg = self['ns-placement-groups'];
350 let ha = pg[pgi]['host-aggregate'];
351 ha.push({});
352 self.setState({
353 'ns-placement-groups': pg
354 })
355 },
356 removeHostAggregate: (pgi, hai) => {
357 let pg = self['ns-placement-groups'];
358 let ha = pg[pgi]['host-aggregate'];
359 ha.splice(hai, 1);
360 self.setState({
361 'ns-placement-groups': pg
362 })
363 },
364 getNSDByID: (id) => {
365
366 }
367 }
368 }
369 vnfFn = () => {
370 let self = this;
371 return {
372 placementGroupUpdate: (i, k, event) => {
373 let value = event.target.value;
374 let pg = self['vnf-placement-groups'];
375 pg[i][k] = value;
376 self.setState({
377 'vnf-placement-groups': pg
378 })
379 },
380 hostAggregateUpdate: (pgi, hai, k, event) => {
381 let value = event.target.value;
382 let pg = self['vnf-placement-groups'];
383 let ha = pg[pgi]['host-aggregate'][hai];
384 ha[k] = value;
385 self.setState({
386 'vnf-placement-groups': pg
387 })
388 },
389 addHostAggregate: (pgi) => {
390 let pg = self['vnf-placement-groups'];
391 let ha = pg[pgi]['host-aggregate'];
392 ha.push({});
393 self.setState({
394 'vnf-placement-groups': pg
395 })
396 },
397 removeHostAggregate: (pgi, hai) => {
398 let pg = self['vnf-placement-groups'];
399 let ha = pg[pgi]['host-aggregate'];
400 ha.splice(hai, 1);
401 self.setState({
402 'vnf-placement-groups': pg
403 })
404 },
405 updateSelectedConfigAgent: (id) => {
406 return function(e) {
407 let configAgentRef = JSON.parse(e.target.value);
408 let vnfDC = self.vnfDataCenters;
409 if(configAgentRef) {
410 if (!vnfDC[id]) {
411 vnfDC[id] = {};
412 }
413 vnfDC[id]['config-agent-account'] = configAgentRef;
414 } else {
415 if(vnfDC[id].hasOwnProperty('datacenter')) {
416 delete vnfCA[id]['config-agent-account'];
417 } else {
418 delete vnfCA[id];
419 }
420 }
421 self.setState({
422 vnfDataCenters: vnfDC
423 });
424 }
425 },
426 updateSelectedDataCenter: (id, dataCenter) => {
427 let vnfDC = self.vnfDataCenters;
428 let dc = JSON.parse(JSON.parse(dataCenter.target.value));
429 if (!vnfDC[id]) {
430 vnfDC[id] = {};
431 }
432 vnfDC[id]['member-vnf-index-ref'];
433 if (dc) {
434 vnfDC[id].datacenter = dc;
435 } else {
436 delete vnfDC[id];
437 }
438
439 self.setState({
440 vnfDataCenters: vnfDC
441 });
442 }
443 }
444 }
445 vldFn = () => {
446 let self = this;
447 return {
448 updateType: (i) => {
449 return function(e){
450 let type = e.target.value;
451 let vld = self.vld;
452 if (vld[i].hasOwnProperty('type')) {
453 delete vld[i][vld[i].type]
454 }
455 vld[i].type = type;
456 vld[i][type] = '';
457 if(type == 'ip-profile-ref') {
458 let IPProfile = self.ipProfiles;
459 vld[i][type] = IPProfile[0] && IPProfile[0].name;
460 delete vld[i]['vim-network-name'];
461 delete vld[i]['ipv4-nat-pool-name'];
462 } else {
463 delete vld[i]['dns-server'];
464 vld[i]['ipv4-nat-pool-name'] = self.dataCenterID
465 }
466 if(type == 'none') {
467 delete vld[i]['ip-profile-ref'];
468 delete vld[i]['vim-network-name'];
469 delete vld[i]['ipv4-nat-pool-name'];
470 }
471 self.setState({vld:vld});
472 }
473 },
474 updateValue: (i, type) => {
475 return function(e) {
476 // Select Option returns JSON values.
477 let value = e.target.nodeName == "SELECT" ? JSON.parse(e.target.value) : e.target.value;
478 let vld = self.vld;
479 vld[i][type] = value;
480 self.setState({vld:vld});
481 }
482 }
483 }
484 }
485 ipProfileFn = () => {
486 let self = this;
487 return {
488 updateProfile: (i, key) => {
489 return function(e) {
490 // Select Option returns JSON values.
491 let value = e.target.nodeName == "SELECT" ? JSON.parse(e.target.value) : e.target.value;
492 self.ipProfiles[i]['ip-profile-params'][key] = value;
493
494 if (value == '') {
495 // Don't send this key
496 delete self.ipProfiles[i]['ip-profile-params'][key];
497 }
498
499 self.setState({ipProfiles:self.ipProfiles});
500 }
501 },
502 updateVersion: (i) => {
503 return function(e) {
504 // Select Option returns JSON values.
505 let value = e.target.value;
506 self.ipProfiles[i]['ip-profile-params']['ip-version'] = value;
507 self.setState({ipProfiles:self.ipProfiles});
508 }
509 },
510 updateDNS: (i, dnsIndex) => {
511 return function(e) {
512 // Select Option returns JSON values.
513 let value = e.target.nodeName == "SELECT" ? JSON.parse(e.target.value) : e.target.value;
514 self.ipProfiles[i]['ip-profile-params']['dns-server'][dnsIndex] = value;
515 self.setState({ipProfiles:self.ipProfiles});
516 }
517 },
518 updateDHCP: (i, property) => {
519 return function(e) {
520 let value = e.target.value;
521 //If value is meant to be boolean, convert it
522 if(value == "true" || value == "false") {
523 value = JSON.parse(value);
524 }
525 if(!self.ipProfiles[i]['ip-profile-params'].hasOwnProperty('dhcp-params')) {
526 self.ipProfiles[i]['ip-profile-params']['dhcp-params'] = {
527 enabled: true,
528 'start-address': '',
529 count: ''
530 }
531 }
532 //Removing DCHP property on disable to allow instantiation
533 if(!value) {
534 self.ipProfiles[i]['ip-profile-params']['dhcp-params'] = {
535 enabled: false
536 };
537 } else {
538 self.ipProfiles[i]['ip-profile-params']['dhcp-params'][property] = value;
539 }
540 self.setState({ipProfiles:self.ipProfiles});
541 }
542 }
543 }
544 }
545 dnsFn = () => {
546 let self = this;
547 return {
548 addDNS: (i) => {
549 let self = this;
550 return function(e) {
551 if(self.ipProfiles[i]['ip-profile-params']['dns-server']) {
552 self.ipProfiles[i]['ip-profile-params']['dns-server'].unshift({})
553 } else {
554 self.ipProfiles[i]['ip-profile-params']['dns-server'] = [{}];
555 }
556
557 self.setState({ipProfiles:self.ipProfiles});
558 }
559 },
560 removeDNS: (i, k) => {
561 let self = this;
562 return function(e) {
563 self.ipProfiles[i]['ip-profile-params']['dns-server'].splice(k, 1);
564 if(self.ipProfiles[i]['ip-profile-params']['dns-server'].length == 0) {
565 delete self.ipProfiles[i]['ip-profile-params']['dns-server'];
566 }
567 self.setState({ipProfiles:self.ipProfiles});
568 }
569 },
570 updateDNS: (i, k) => {
571 let self = this;
572 return function(e) {
573 let value = e.target.value;
574 self.ipProfiles[i]['ip-profile-params']['dns-server'][k].address = value;
575 self.setState({ipProfiles:self.ipProfiles});
576 }
577 }
578 }
579 }
580 sshFn = () => {
581 let self = this;
582 return {
583 updateNewKeyRefSelection: (e) => {
584 self.setState({
585 newRefSelection: e.target.value
586 })
587 },
588 updateKeyRef: (refIndex, remove) => {
589 let self = this;
590 return function(e) {
591 let sshKeysRef = self.sshKeysRef;
592 if(!remove) {
593 // if(!e.target.value) {
594 // return Alt.actions.global.showError.defer('Please select a key pair');
595 // } else {
596 if(!isNaN(refIndex)){
597 sshKeysRef.splice(refIndex, 1);
598 sshKeysRef.push(e.target.value);
599 } else {
600 sshKeysRef.push(e.target.value);
601 }
602 // }
603 } else {
604 sshKeysRef.splice(refIndex, 1);
605 }
606 self.setState({
607 sshKeysRef: sshKeysRef,
608 newRefSelection: null
609 })
610 }
611 }
612 }
613 }
614 usersFn = () => {
615 let self = this;
616 return {
617 add: function(sshKeysList) {
618 return function(e) {
619 let newUser = {
620 name: '',
621 'user-info': '',
622 'ssh-authorized-key': [sshKeysList[0].name]
623 }
624 let usersList = self.usersList;
625 usersList.push(newUser);
626 self.setState({
627 usersList: usersList
628 })
629 }
630 },
631 remove: function(i) {
632 return function() {
633 self.usersList.splice(i, 1);
634 self.setState({
635 usersList: self.usersList
636 })
637 }
638 },
639 update: function(i, key) {
640 return function(e) {
641 let value = e.target.value;
642 self.usersList[i][key] = value;
643 self.setState({
644 usersList: self.usersList
645 })
646 }
647 },
648 updateSSHkeyRef: function(i, j, remove){
649 return function(e) {
650 let usersList = _cloneDeep(self.usersList)
651 let keys = usersList[i]['ssh-authorized-key'];
652 if(!remove) {
653 let keyRef = JSON.parse(e.target.value).name;
654 if(!isNaN(j)) {
655 keys.splice(j, 1);
656 }
657 keys.push(keyRef);
658 } else {
659 keys.splice(j, 1);
660 }
661 usersList[i]['ssh-authorized-key'] = keys;
662 self.setState({
663 usersList: usersList
664 })
665 }
666 }
667 }
668 }
669 saveNetworkServiceRecord(name, launch) {
670 let self = this;
671 //input-parameter: [{uuid: < some_unique_name>, xpath: <same as you got from nsd>, value: <user_entered_value>}]
672 /*
673 'input-parameter-xpath':[{
674 'xpath': 'someXpath'
675 }],
676 */
677 let nsPg = null;
678 let vnfPg = null;
679 let guuid = GUID();
680
681 // Create a filtered NSD payload from the decorated one as RW.REST cannot handle extra parameters now
682 let nsdPayload = {};
683 nsdPayload = _cloneDeep(_find(this.state.nsd[0].descriptors, {id: this.state.selectedNSDid}));
684
685 if (nsdPayload != {}) {
686 nsdPayload['meta'] && delete nsdPayload['meta'];
687 nsdPayload['constituent-vnfd'] && nsdPayload['constituent-vnfd'].map((constituentVnfd) => {
688 constituentVnfd['vnf-name'] && delete constituentVnfd['vnf-name'];
689 constituentVnfd['name'] && delete constituentVnfd['name'];
690 });
691 nsdPayload['placement-groups'] && nsdPayload['placement-groups'].map((placementGroup) => {
692 placementGroup['member-vnfd'] && placementGroup['member-vnfd'].map((memberVnfd) => {
693 memberVnfd['name'] && delete memberVnfd['name'];
694 });
695 })
696 nsdPayload['ns-placement-groups'] && delete nsdPayload['ns-placement-groups'];
697 nsdPayload['vnf-placement-groups'] && delete nsdPayload['vnf-placement-groups'];
698 nsdPayload.vld = this.state.vld;
699 nsdPayload.vld && nsdPayload.vld.map(function(v){
700 delete v['none'];
701 delete v.type;
702 });
703 nsdPayload['input-parameter-xpath'] && nsdPayload['input-parameter-xpath'].map((x) => delete x.value);
704 }
705 let payload = {
706 id: guuid,
707 "name": name,
708 "short-name": name,
709 "description": "a description for " + guuid,
710 "admin-status": launch ? "ENABLED" : "DISABLED",
711 "nsd": nsdPayload
712 }
713
714 if(!this.state.selectedResourceOrchestrator) {
715 Alt.actions.global.showNotification.defer("No Resource Orchestrator selected");
716 return;
717 }
718 if (this.state.selectedResourceOrchestrator.name != "rift") {
719 payload["resource-orchestrator"] = this.state.selectedResourceOrchestrator.name;
720 }
721
722 if(!this.state.dataCenterID) {
723 Alt.actions.global.showNotification.defer("No Data Center selected");
724 return;
725 }
726 payload["datacenter"] = this.state.dataCenterID;
727
728 //Clean Input Parameters
729 if (this.state.hasConfigureNSD) {
730 let ips = _cloneDeep(this.state['input-parameters']);
731
732 let ipsToSend = ips.filter(function(ip) {
733 if (ip.value && ip.value != "") {
734 delete ip.label;
735 delete ip.name;
736 delete ip['default-value'];
737
738 return true;
739 }
740 return false;
741 });
742 if (ipsToSend.length > 0) {
743 payload['input-parameter'] = ipsToSend;
744 }
745 }
746 //Clean VNF Input Parameters
747 if (this.state.hasConfigureVNFD) {
748 let vnf = _cloneDeep(this.state['vnf-input-parameter']);
749 vnf = vnf.filter(function(v){
750 delete v.name;
751 v['input-parameter'] = v['input-parameter'].filter(
752 function(i) {
753 if(i.value && i.value != "") {
754 delete i.label;
755 delete i['default-value'];
756 return true;
757 }
758 return false;
759 });
760 if (v['input-parameter'].length) {
761 return true;
762 }
763 return false;
764 })
765 if (vnf.length > 0) {
766 payload['vnf-input-parameter'] = vnf;
767 }
768 }
769 let VnfDataCenters = this.state.vnfDataCenters;
770 if (Object.keys(VnfDataCenters).length) {
771 payload['vnf-datacenter-map'] = Object.keys(VnfDataCenters).map(function(k) {
772 return {
773 'member-vnf-index-ref' : k,
774 datacenter: VnfDataCenters[k].datacenter
775 }
776 })
777 }
778 // These placement groups need to be refactored. Too much boilerplate.
779 if (this.state.displayPlacementGroups) {
780 nsPg = this.state['ns-placement-groups'];
781 vnfPg = this.state['vnf-placement-groups'];
782 if(nsPg && (nsPg.length > 0)) {
783 payload['nsd-placement-group-maps'] = nsPg.map(function(n, i) {
784 if(n['availability-zone'] || n['server-group'] || (n['host-aggregate'].length > 0)) {
785 var obj = {
786 'cloud-type': self.state.dataCenterType
787 };
788 if(n['host-aggregate'].length > 0) {
789 obj['host-aggregate'] = n['host-aggregate'].map(function(h, j) {
790 return {
791 'metadata-key': h.key,
792 'metadata-value': h.value
793 }
794 })
795 }
796 if(n['availability-zone'] && (n['availability-zone'] != '')) {
797 obj['availability-zone'] = {name: n['availability-zone']};
798 }
799 if(n['server-group'] && (n['server-group'] != '')) {
800 obj['server-group'] = {name: n['server-group']};
801 }
802 obj['placement-group-ref'] = n.name;
803 return obj;
804 }
805 }).filter(function(o){
806 if(o) {
807 return true;
808 } else {
809 return false;
810 }
811 });
812 };
813 if(vnfPg && (vnfPg.length > 0)) {
814 let vnfDataCenterDictionary = {};
815 payload['vnf-datacenter-map'] && payload['vnf-datacenter-map'].map(function(d) {
816 vnfDataCenterDictionary[d['member-vnf-index-ref']] = d.datacenter
817 })
818 payload['vnfd-placement-group-maps'] = vnfPg.map(function(n, i) {
819 if(n['availability-zone'] || n['server-group'] || (n['host-aggregate'].length > 0)) {
820 let DC = vnfDataCenterDictionary[n['member-vnf-index']];
821 var obj = {
822 'cloud-type': DC ? _find(self.state.selectedResourceOrchestrator.datacenters.datacenters, {name: DC})['datacenter-type'] : self.state.dataCenterType
823 };
824 if(n['host-aggregate'].length > 0) {
825 obj['host-aggregate'] = n['host-aggregate'].map(function(h, j) {
826 return {
827 'metadata-key': h.key,
828 'metadata-value': h.value
829 }
830 })
831 }
832 if(n['server-group'] && (n['server-group'] != '')) {
833 obj['server-group'] = {name: n['server-group']};
834 }
835 if(n['availability-zone'] && (n['availability-zone'] != '')) {
836 obj['availability-zone'] = {name: n['availability-zone']};
837 }
838 obj['placement-group-ref'] = n.name;
839 obj['vnfd-id-ref'] = n['vnfd-id-ref'];
840 return obj;
841 }
842 }).filter(function(o){
843 if(o) {
844 return true;
845 } else {
846 return false;
847 }
848 });
849 }
850 }
851
852 //Add SSH-Keys
853 payload['ssh-authorized-key'] = this.state.sshKeysRef.map(function(k) {
854 return {'key-pair-ref': JSON.parse(k).name};
855 });
856 //Add Users
857 payload['user'] = addKeyPairRefToUsers(this.state.usersList);
858 console.log(payload)
859 this.launchNSR({
860 'nsr': [payload]
861 });
862 }
863 }
864
865
866 function addKeyPairRefToUsers(list) {
867 return list.map(function(u) {
868 return {
869 name: u.name,
870 'user-info': u['user-info'],
871 'ssh-authorized-key': u['ssh-authorized-key'].map(function(k) {
872 return {
873 'key-pair-ref' : k
874 }
875 })
876 }
877 })
878 }
879
880 function getMockSLA(id) {
881 console.log('Getting mock SLA Data for id: ' + id);
882 this.setState({
883 sla_parameters: slaData
884 });
885 }
886
887 function getMockData() {
888 console.log('Getting mock Descriptor Data');
889 this.setState({
890 nsd: data.nsd,
891 vnfd: data.vnfd,
892 pnfd: data.pnfd
893 });
894 }
895 export default LaunchNetworkServiceStore;