VM data retrieval from APPC for open stack action

VM data retrieval and stopping user not to navigate to PD and template
if mandatory fields are missing in reference data.

Issue-ID: APPC-853
Change-Id: Id43500579c6d222a2c17a53db9213372afec565f
Signed-off-by: Mohamed Asgar Samiulla(ma926a) <ma926a@us.att.com>
diff --git a/src/app/vnfs/build-artifacts/build-artifacts.component.html b/src/app/vnfs/build-artifacts/build-artifacts.component.html
index feb5be8..33d8064 100644
--- a/src/app/vnfs/build-artifacts/build-artifacts.component.html
+++ b/src/app/vnfs/build-artifacts/build-artifacts.component.html
@@ -25,8 +25,15 @@
         <div class="col-xs-12 col-sm-12 col-md-12 col-lg-12">
             <ul class="nav nav-tabs custom-heade-nav" style="margin-bottom: 12px;">
                 <li [ngClass]="{'active-tab':((router.url.indexOf('/'+item.url))>-1 || router.url.indexOf(item.url)>-1 )}" *ngFor="let item of tabs">
-                    <a *ngIf="this.refDataRequiredFiels == true" [routerLink]="[item.url]" [type]="item.type" class="nav-link">{{item.name}}</a>
-                    <a *ngIf="this.refDataRequiredFiels == false" [type]="item.type" class="nav-link">{{item.name}}</a>
+                     <a *ngIf="this.refDataRequiredFiels == true" 
+                        [routerLink]="[item.url]" 
+                        [type]="item.type" 
+                        class="nav-link">{{item.name}}</a>
+
+                    <a *ngIf="this.refDataRequiredFiels == false" 
+                        [type]="item.type" 
+                        class="nav-link" 
+                        (click)="checkRefDataReqFields()">{{item.name}}</a>
                 </li>
             </ul>
         </div>
diff --git a/src/app/vnfs/build-artifacts/build-artifacts.component.spec.ts b/src/app/vnfs/build-artifacts/build-artifacts.component.spec.ts
index 16d7029..48edb99 100644
--- a/src/app/vnfs/build-artifacts/build-artifacts.component.spec.ts
+++ b/src/app/vnfs/build-artifacts/build-artifacts.component.spec.ts
@@ -101,4 +101,33 @@
         expect(component.refDataRequiredFiels).toBeTruthy();
     });
 
+// Test checkRefDataReqFields Method
+    it('Should notify error message if action is not valid', () => {
+        let spy = spyOn(NotificationsService.prototype, 'error');
+        component.refList = {"action": "", "scope": {"vnf-type": "test 1"}, "device-protocol": "ANSIBLE"};
+
+        component.checkRefDataReqFields();
+
+        expect(spy).toHaveBeenCalled();
+    });
+
+    it('Should notify error message if VNF Type is not valid', () => {
+        let spy = spyOn(NotificationsService.prototype, 'error');
+        component.refList = {"action": "Configure", "scope": {"vnf-type": ""}, "device-protocol": "ANSIBLE"};
+
+        component.checkRefDataReqFields();
+
+        expect(spy).toHaveBeenCalled();
+    });
+
+    it('Should notify error message if Device Protocol is not valid', () => {
+        let spy = spyOn(NotificationsService.prototype, 'error');
+        component.refList = {"action": "Configure", "scope": {"vnf-type": "test 1"}, "device-protocol": ""};
+
+        component.checkRefDataReqFields();
+
+        expect(spy).toHaveBeenCalled();
+    });
+
+
 });
diff --git a/src/app/vnfs/build-artifacts/build-artifacts.component.ts b/src/app/vnfs/build-artifacts/build-artifacts.component.ts
index 265fd77..ba88717 100644
--- a/src/app/vnfs/build-artifacts/build-artifacts.component.ts
+++ b/src/app/vnfs/build-artifacts/build-artifacts.component.ts
@@ -23,14 +23,17 @@
 import { Component, OnInit } from '@angular/core';
 import { Router } from '@angular/router';
 import * as _ from 'underscore';
+import { NotificationsService } from 'angular2-notifications';
+
 
 @Component({ selector: 'app-build-design', templateUrl: './build-artifacts.component.html', styleUrls: ['./build-artifacts.component.css'] })
 export class BuildDesignComponent implements OnInit {
     tabs: Array<Object> = [];
     private allowOtherUpdates: boolean = true;
     public refDataRequiredFiels: boolean = false;
+    public refList;
 
-    constructor(private router: Router) {
+    constructor (private router: Router, private notificationsService: NotificationsService) {
     }
 
     ngOnInit() {
@@ -81,12 +84,35 @@
     }
 
     public getRefData(referenceList) {
-        if (referenceList.action !== '' && referenceList['vnf-type'] !== '' && referenceList['device-protocol'] !== '') {
-            this.refDataRequiredFiels = true;
+        this.refList = referenceList;
+        if(referenceList.action !== '' && referenceList.scope['vnf-type'] !== '' && referenceList['device-protocol'] !== '') {
+            if(referenceList.action === 'ConfigScaleOut') {
+                if(referenceList.hasOwnProperty('template-id') && referenceList['template-id'] !== undefined && referenceList['template-id'] != '')
+                    this.refDataRequiredFiels = true;
+            }
+            else this.refDataRequiredFiels = true;
         }
         else {
             this.refDataRequiredFiels = false;
         }
     }
 
+     public checkRefDataReqFields() {
+        if(this.refList.action == '' && this.refList.scope['vnf-type'] == '' && this.refList['device-protocol'] == '') {
+            this.notificationsService.error('Error', 'Select Valid Action, VNF Type, Device Protocol');
+        } 
+        else if(this.refList.action == '') {
+            this.notificationsService.error('Error', 'Select a valid Action');
+        } 
+        else if(this.refList.scope['vnf-type'] == '') {
+            this.notificationsService.error('Error', 'Select a valid VNF Type');
+        } 
+        else if(this.refList['device-protocol'] == '') {
+            this.notificationsService.error('Error', 'Select a valid Device Protocol');
+        } 
+        else if (this.refList.action === 'ConfigScaleOut') {
+            this.notificationsService.error('Error', 'Select a valid Template Identifier');
+        }
+    }
+
 }
diff --git a/src/app/vnfs/build-artifacts/parameter-definitions/parameter.component.ts b/src/app/vnfs/build-artifacts/parameter-definitions/parameter.component.ts
index e7e60c3..80269cb 100644
--- a/src/app/vnfs/build-artifacts/parameter-definitions/parameter.component.ts
+++ b/src/app/vnfs/build-artifacts/parameter-definitions/parameter.component.ts
@@ -185,7 +185,7 @@
     public artifactName;
     public appDataObject: any;
     public downloadDataObject: any;
-    public artifact_fileName;
+    public artifact_fileName="";
     identifier: any;
     private selectedActionReference: any;
 
@@ -213,12 +213,13 @@
                 if (artifactList[i]['artifact-type'] === 'parameter_definitions') {
                     var artifactName = artifactList[i]['artifact-name'];
                     var artifactNameWithoutExtension = '';
-                    if (artifactName) artifactNameWithoutExtension = artifactName.substring(0, artifactName.lastIndexOf("."))
-                    var identifier = artifactNameWithoutExtension.split("_");
-                    var id = '';
-                    if (identifier) id = identifier[identifier.length - 1];
-                    if (this.mappingEditorService.identifier) {
-                        if (id === this.mappingEditorService.identifier) this.artifact_fileName = artifactName;
+                    if (artifactName) {
+                        artifactNameWithoutExtension = artifactName.substring(0, artifactName.lastIndexOf("."));
+                    }
+                    if(this.mappingEditorService.identifier) {
+                        if(artifactNameWithoutExtension.endsWith(this.mappingEditorService.identifier)) {
+                            this.artifact_fileName = artifactName;
+                        }
 
                     }
                     else {
diff --git a/src/app/vnfs/build-artifacts/reference-dataform/reference-dataform.component.spec.ts b/src/app/vnfs/build-artifacts/reference-dataform/reference-dataform.component.spec.ts
index 72f56a7..43a367a 100644
--- a/src/app/vnfs/build-artifacts/reference-dataform/reference-dataform.component.spec.ts
+++ b/src/app/vnfs/build-artifacts/reference-dataform/reference-dataform.component.spec.ts
@@ -972,4 +972,14 @@
         expect(spy).toHaveBeenCalled()
     });
 
+    it('Should return valid data in getArtifactsOpenStack', () => {
+        component.tempAllData = [{"action":"OpenStack Actions","action-level":"vnf","scope":{"vnf-type":"OpenStack test8","vnfc-type":""},"template":"N","vm":[],"device-protocol":"OpenStack","user-name":"","port-number":"","artifact-list":[],"scopeType":"vnf-type"},{"action":"AllAction","action-level":"vnf","scope":{"vnf-type":"OpenStack test8","vnfc-type":""},"artifact-list":[{"artifact-name":"reference_AllAction_OpenStacktest8_0.0.1V.json","artifact-type":"reference_template"}]},{"action":"Migrate","action-level":"vm","scope":{"vnf-type":"OpenStack test8","vnfc-type":null},"vnfc-function-code-list":["First","Second","Third","Fourth","Fifth"],"template":"N","device-protocol":"OS"},{"action":"Reboot","action-level":"vm","scope":{"vnf-type":"OpenStack test8","vnfc-type":null},"vnfc-function-code-list":["First","Second","Fourth","Fifth"],"template":"N","device-protocol":"OS"},{"action":"Rebuild","action-level":"vm","scope":{"vnf-type":"OpenStack test8","vnfc-type":null},"vnfc-function-code-list":["First","Second","Third","Fourth"],"template":"N","device-protocol":"OS"},{"action":"Snapshot","action-level":"vm","scope":{"vnf-type":"OpenStack test8","vnfc-type":null},"vnfc-function-code-list":["First","Third"],"template":"N","device-protocol":"OS"},{"action":"AttachVolume","action-level":"vm","scope":{"vnf-type":"OpenStack test8","vnfc-type":null},"vnfc-function-code-list":["First","Second","Third","Fourth"],"template":"N","device-protocol":"OS"},{"action":"DetachVolume","action-level":"vm","scope":{"vnf-type":"OpenStack test8","vnfc-type":null},"vnfc-function-code-list":["First","Fourth"],"template":"N","device-protocol":"OS"}]
+        let firstArrayElement = ["VM Type","First","Second","Third","Fourth","Fifth"];
+        let remUploadedDataArray = [["Migrate","Y","Y","Y","Y","Y"],["Reboot","Y","Y","","Y","Y"],["Rebuild","Y","Y","Y","Y"],["Snapshot","Y","","Y"],["AttachVolume","Y","Y","Y","Y"],["DetachVolume","Y","","","Y"]];
+        
+        component.getArtifactsOpenStack();
+        
+        expect(component.firstArrayElement).toEqual(firstArrayElement);        
+        expect(component.remUploadedDataArray).toEqual(remUploadedDataArray);        
+    });
 });
diff --git a/src/app/vnfs/build-artifacts/reference-dataform/reference-dataform.component.ts b/src/app/vnfs/build-artifacts/reference-dataform/reference-dataform.component.ts
index 72501ab..62b3044 100644
--- a/src/app/vnfs/build-artifacts/reference-dataform/reference-dataform.component.ts
+++ b/src/app/vnfs/build-artifacts/reference-dataform/reference-dataform.component.ts
@@ -895,15 +895,19 @@
                     this.toggleIdentifier(data)
                     this.oldAction = this.currentAction;// this.referenceDataObject.action + '';
                     this.referenceDataObject.action = this.currentAction
+
                     this.populateExistinAction(data);
                     if (this.oldAction === 'OpenStack Actions') {
+
                         this.uploadedDataArray = [];
                         this.remUploadedDataArray = [];
                         this.firstArrayElement = [];
                         this.uploadFileName = '';
+                        //this.tempAllData = [];
                     }
                     this.clearCache();
                     this.refernceScopeObj.from = '';
+                    this.getArtifactsOpenStack()
                 } else {
                     this.toggleIdentifier(data)
                     this.currentAction = this.referenceDataObject.action;
@@ -914,8 +918,15 @@
                     this.clearVnfcData()
                     this.refernceScopeObj.from = '';
                 }
+
                 // Enable or Block Template and PD Tabs
-                this.buildDesignComponent.getRefData(this.referenceDataObject);
+                if(this.currentAction == 'ConfigScaleOut' && this.templateIdentifier) {
+                    let referenceDataObjectTemp = this.referenceDataObject;
+                    referenceDataObjectTemp['template-id'] = this.templateIdentifier;
+                    this.buildDesignComponent.getRefData(referenceDataObjectTemp);
+                } else {
+                    this.buildDesignComponent.getRefData(this.referenceDataObject);
+                }
             });
         } else {
             this.actionChanged = true;
@@ -923,8 +934,15 @@
             this.populateExistinAction(data);
             this.resetVmsForScaleout(data);
             this.toggleIdentifier(data);
+
             // Enable or Block Template and PD Tabs
-            this.buildDesignComponent.getRefData(this.referenceDataObject);
+            if(this.currentAction == 'ConfigScaleOut' && this.templateIdentifier) {
+                let referenceDataObjectTemp = this.referenceDataObject;
+                referenceDataObjectTemp['template-id'] = this.templateIdentifier;
+                this.buildDesignComponent.getRefData(referenceDataObjectTemp);
+            } else {
+                this.buildDesignComponent.getRefData(this.referenceDataObject);
+            }
         }
         this.configDrp(data)
     }
@@ -977,6 +995,11 @@
         if (data == null) {
             return;
         }
+        // Enable or Block Template and PD Tabs
+        let referenceDataObjectTemp = this.referenceDataObject;
+        referenceDataObjectTemp['template-id'] = data;
+        this.buildDesignComponent.getRefData(referenceDataObjectTemp);
+
         if ((userForm.valid) && this.oldAction != '' && this.oldAction != undefined) {
             this.currentAction = "ConfigScaleOut"
             let referenceObject = this.prepareReferenceObject();
@@ -1324,22 +1347,24 @@
     trackByFn(index, item) {
         return index; 
     }
-    getArtifactsOpenStack() {
+   getArtifactsOpenStack() {
         var array = []
         var vnfcFunctionCodeArrayList = [];
         var vnfcSet = new Set();
-        vnfcSet.add("VM Type")
         for (var i = 0; i < this.tempAllData.length; i++) {
             if (!this.checkIfelementExistsInArray(this.tempAllData[i].action, this.actions) && (this.tempAllData[i].action != 'AllAction')) {
                 var vnfcFunctionCodeArray = this.tempAllData[i]["vnfc-function-code-list"]
+                vnfcSet.add("Actions")
                 for (var j = 0; j < vnfcFunctionCodeArray.length; j++) {
                     vnfcSet.add(vnfcFunctionCodeArray[j])
                 }
                 vnfcFunctionCodeArrayList.push([this.tempAllData[i].action].concat(this.tempAllData[i]["vnfc-function-code-list"]))
             }
         }
+
         var vnfcSetArray = Array.from(vnfcSet);
         let vnfcSetArrayLen = vnfcSetArray.length;
+
         for (let i = 0; i < vnfcFunctionCodeArrayList.length; i++) {
             let element = vnfcFunctionCodeArrayList[i];
             for (let j = 1; j < element.length; j++) {
diff --git a/src/app/vnfs/build-artifacts/template-holder/template-configuration/template-configuration.component.ts b/src/app/vnfs/build-artifacts/template-holder/template-configuration/template-configuration.component.ts
index 3868485..a37834e 100644
--- a/src/app/vnfs/build-artifacts/template-holder/template-configuration/template-configuration.component.ts
+++ b/src/app/vnfs/build-artifacts/template-holder/template-configuration/template-configuration.component.ts
@@ -188,12 +188,13 @@
         if (artifactList[i]['artifact-type'] === 'config_template') {
           var artifactName = artifactList[i]['artifact-name'];
           var artifactNameWithoutExtension = '';
-          if (artifactName) artifactNameWithoutExtension = artifactName.substring(0, artifactName.lastIndexOf("."))
-          var identifier = artifactNameWithoutExtension.split("_");
-          var id = '';
-          if (identifier) id = identifier[identifier.length - 1];
-          if (this.mappingEditorService.identifier) {
-            if (id === this.mappingEditorService.identifier) this.artifactName = artifactName;
+                    if (artifactName) {
+            artifactNameWithoutExtension = artifactName.substring(0, artifactName.lastIndexOf("."));
+          }
+          if(this.mappingEditorService.identifier) {
+            if(artifactNameWithoutExtension.endsWith(this.mappingEditorService.identifier)) {
+                this.artifactName = artifactName;
+            }
           }
           else {
             this.artifactName = artifactName;