add new action configscalein for cdt

Change-Id: I2f05079b7c2428351332ac84c1ea56f31d4a38d9
Issue-ID: APPC-1760
Signed-off-by: Taka Cho <takamune.cho@att.com>
diff --git a/src/app/pipes/vm-filtering.pipe.ts b/src/app/pipes/vm-filtering.pipe.ts
index 6da7840..ec1aaa3 100644
--- a/src/app/pipes/vm-filtering.pipe.ts
+++ b/src/app/pipes/vm-filtering.pipe.ts
@@ -25,12 +25,12 @@
 
     transform(value: any, action: any, templateId, newVnfc): any {
         let filterValue
-        if(action == 'ConfigScaleOut'){
+        if(action == 'ConfigScaleOut' || action == 'ConfigScaleIn'){
             filterValue= templateId
         } else if(action == 'Configure' || action == 'ConfigModify' || action == 'DistributeTraffic' || action == 'DistributeTrafficCheck'){
             filterValue= newVnfc
         }
-        if (action == 'ConfigScaleOut') {
+        if (action == 'ConfigScaleOut' || action == 'ConfigScaleIn' ) {
             let x = value.filter(obj => {
                 //return value
                 return obj['template-id'] == filterValue;
diff --git a/src/app/shared/pipes/vm-filtering.pipe.spec.ts b/src/app/shared/pipes/vm-filtering.pipe.spec.ts
index 9c544cb..08df4de 100644
--- a/src/app/shared/pipes/vm-filtering.pipe.spec.ts
+++ b/src/app/shared/pipes/vm-filtering.pipe.spec.ts
@@ -38,6 +38,16 @@
         expect(pipe.transform(objArray,"ConfigScaleOut",1, {})[0].type,).toBe("conScale")
 
     });
+    it('should return configscalein values if template id matches',()=>{
+        const pipe = new VmFilteringPipe();
+
+        let objArray = [
+            {action:"Configure","template-id":2,"type":"con"},
+            {action:"ConfigScaleIn","template-id":1,"type":"conScale"}
+        ]
+        expect(pipe.transform(objArray,"ConfigScaleIn",1, {})[0].type,).toBe("conScale")
+
+    });
     it('should return configure calues',()=>{
         const pipe = new VmFilteringPipe();
 
diff --git a/src/app/shared/pipes/vm-filtering.pipe.ts b/src/app/shared/pipes/vm-filtering.pipe.ts
index 6da7840..4c49eb3 100644
--- a/src/app/shared/pipes/vm-filtering.pipe.ts
+++ b/src/app/shared/pipes/vm-filtering.pipe.ts
@@ -25,12 +25,12 @@
 
     transform(value: any, action: any, templateId, newVnfc): any {
         let filterValue
-        if(action == 'ConfigScaleOut'){
+        if(action == 'ConfigScaleOut' || action == 'ConfigScaleIn'){
             filterValue= templateId
         } else if(action == 'Configure' || action == 'ConfigModify' || action == 'DistributeTraffic' || action == 'DistributeTrafficCheck'){
             filterValue= newVnfc
         }
-        if (action == 'ConfigScaleOut') {
+        if (action == 'ConfigScaleOut' || action == 'ConfigScaleIn') {
             let x = value.filter(obj => {
                 //return value
                 return obj['template-id'] == filterValue;
diff --git a/src/app/vnfs/build-artifacts/build-artifacts.component.ts b/src/app/vnfs/build-artifacts/build-artifacts.component.ts
index 4e00341..4ae123b 100644
--- a/src/app/vnfs/build-artifacts/build-artifacts.component.ts
+++ b/src/app/vnfs/build-artifacts/build-artifacts.component.ts
@@ -28,7 +28,7 @@
 import { NotificationsService } from 'angular2-notifications';
 import { appConstants } from '../../../constants/app-constants';
 
-export const ACTIONS_REQUIRED_DROPDOWN = ['Configure', 'ConfigModify', 'ConfigScaleOut', 'DistributeTraffic', 'DistributeTrafficCheck']
+export const ACTIONS_REQUIRED_DROPDOWN = ['Configure', 'ConfigModify', 'ConfigScaleOut', 'DistributeTraffic', 'DistributeTrafficCheck', 'ConfigScaleIn']
 
 
 @Component({ selector: 'app-build-design', templateUrl: './build-artifacts.component.html', styleUrls: ['./build-artifacts.component.css'] })
@@ -80,7 +80,7 @@
                 // if (referenceList.hasOwnProperty('template-id') && referenceList['template-id'] !== undefined && referenceList['template-id'] != '')
                 //     this.refDataRequiredFiels = true;
                 // else this.refDataRequiredFiels = false;
-                if(referenceList.action == 'ConfigScaleOut') {
+                if(referenceList.action == 'ConfigScaleOut' || referenceList.action == 'ConfigScaleIn') {
                     if(reqObj != undefined && reqObj.hasOwnProperty('reqField') && reqObj.reqField != '') this.refDataRequiredFiels = true;
                     else this.refDataRequiredFiels = false;
                 }
@@ -112,7 +112,7 @@
         else if (this.refList['device-protocol'] == appConstants.DeviceProtocols.blank) {
             this.notificationsService.error(appConstants.errors.error, appConstants.errors.noDeviceProtocolError);
         }
-        else if (this.refList.action === appConstants.Actions.configScaleOut) {
+        else if (this.refList.action === appConstants.Actions.configScaleOut || this.refList.action === appConstants.Actions.configScaleIn) {
             this.notificationsService.error(appConstants.errors.error, appConstants.errors.noValidTemplateIdentifierError);
         }
     }
diff --git a/src/app/vnfs/build-artifacts/parameter-definitions/parameter.component.html b/src/app/vnfs/build-artifacts/parameter-definitions/parameter.component.html
index 9cddc8e..2ff2b9b 100644
--- a/src/app/vnfs/build-artifacts/parameter-definitions/parameter.component.html
+++ b/src/app/vnfs/build-artifacts/parameter-definitions/parameter.component.html
@@ -49,7 +49,7 @@
             <div class="col-lg-3 col-sm-6 col-md-3 col-xs-12">
                 <label>Protocol</label><input class="form-control" type="text" disabled value="{{protocol}}" />
             </div>
-            <div *ngIf="(action === 'ConfigScaleOut')" class="col-lg-3 col-sm-6 col-md-3 col-xs-12">
+            <div *ngIf="(action === 'ConfigScaleOut' || action === 'ConfigScaleIn')" class="col-lg-3 col-sm-6 col-md-3 col-xs-12">
                 <label>Template Identifier</label><input class="form-control" type="text" disabled value="{{template_id}}" />
             </div>
         </div>
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 ad0adf3..64f1159 100644
--- a/src/app/vnfs/build-artifacts/parameter-definitions/parameter.component.ts
+++ b/src/app/vnfs/build-artifacts/parameter-definitions/parameter.component.ts
@@ -142,7 +142,7 @@
                 console.log( this.clName+": "+methName+": have vnfcType:["+
                   this.vnfcType+"]");
             }
-            if( this.action === 'ConfigScaleOut'){
+            if( this.action === 'ConfigScaleOut' || this.action === 'ConfigScaleIn'){
                 // this.template_id = this.selectedActionReference.templateId;
                 this.template_id = this.mappingEditorService.identifier;
             }
diff --git a/src/app/vnfs/build-artifacts/reference-dataform/reference-dataform.component.html b/src/app/vnfs/build-artifacts/reference-dataform/reference-dataform.component.html
index bf1589b..300a598 100644
--- a/src/app/vnfs/build-artifacts/reference-dataform/reference-dataform.component.html
+++ b/src/app/vnfs/build-artifacts/reference-dataform/reference-dataform.component.html
@@ -67,7 +67,7 @@
                     </select>
 
                 </div>
-                <div class="col-lg-3 col-sm-6 col-md-3 col-xs-12" *ngIf="isConfigScaleOut">
+                <div class="col-lg-3 col-sm-6 col-md-3 col-xs-12" *ngIf="(isConfigScaleOut || isConfigScaleIn)">
                     <label>Template Identifier</label>
                     <select class="form-control" required id="tempIdentifier" (ngModelChange)="dataModified();idChange($event,userForm)" [(ngModel)]="templateIdentifier" #deviceProtocol="ngModel" name="templateIdentifier">
                         <option [value]="val" *ngFor="let val of referenceDataObject['template-id-list']">{{val}}
@@ -76,8 +76,8 @@
                     <!-- <span class="error-message" [hidden]="deviceProtocol.valid || (deviceProtocol.pristine && !userForm.submitted)">Required Field</span> -->
                 </div>
 
-                <div class="col-lg-3 col-sm-6 col-md-3 col-xs-12" *ngIf="referenceDataObject['action']== 'ConfigScaleOut'" style="margin-top: 30px">
-                    <span *ngIf="referenceDataObject.action === 'ConfigScaleOut'">   <a style="    color: blue;"
+                <div class="col-lg-3 col-sm-6 col-md-3 col-xs-12" *ngIf="(referenceDataObject['action']== 'ConfigScaleOut' || referenceDataObject['action']== 'ConfigScaleIn')" style="margin-top: 30px">
+                    <span *ngIf="(referenceDataObject.action === 'ConfigScaleOut' || referenceDataObject.action === 'ConfigScaleIn')">   <a style="    color: blue;"
                     href="javascript:void(0)"
                     (click)="identifierModal.open()">Assign New Template Identifier</a></span>
 
@@ -142,7 +142,7 @@
                                 </div>
                             </div>
                             <br/>
-                            <div class="card-block" *ngIf="(referenceDataObject.action =='ConfigScaleOut' || referenceDataObject.action =='Configure'|| referenceDataObject.action ==''  || referenceDataObject.action ==undefined)" style="border-top: 5px solid #6ab344;border-top-right-radius: 7px;border-top-left-radius: 7px;">
+                            <div class="card-block" *ngIf="(referenceDataObject.action =='ConfigScaleOut' || referenceDataObject.action =='ConfigScaleIn' || referenceDataObject.action =='Configure'|| referenceDataObject.action ==''  || referenceDataObject.action ==undefined)" style="border-top: 5px solid #6ab344;border-top-right-radius: 7px;border-top-left-radius: 7px;">
                                 <div class="col-12">
                                     <h5 style="margin-top: 0.5rem;font-family: Roboto"> VNFC Information
                                         <span class="pull-right">
@@ -153,7 +153,7 @@
                                     </h5>
                                 </div>
                             </div>
-                            <div class="row" *ngIf="(( referenceDataObject.action =='ConfigScaleOut' ||referenceDataObject.action =='Configure'|| referenceDataObject.action =='' || referenceDataObject.action ==undefined ) && isCollapsedContent) ">
+                            <div class="row" *ngIf="(( referenceDataObject.action =='ConfigScaleOut' || referenceDataObject.action =='ConfigScaleIn' ||referenceDataObject.action =='Configure'|| referenceDataObject.action =='' || referenceDataObject.action ==undefined ) && isCollapsedContent) ">
                                 <div class="col-lg-2 col-sm-6 col-md-2 col-xs-12">
                                     <label style="font-size:12px;">VNFC Type (NFC Function)</label>
                                     <input type="text" class="form-control" id="txtVnfcTypeInColl" [(ngModel)]="Sample['vnfc-type']" (blur)="checkVnfcTypeEqual(vnfcType.value)" #vnfcType="ngModel" name="samplevnfcType">
@@ -185,7 +185,7 @@
                                 </div>
                             </div>
                             <hr>
-                            <div *ngIf="(referenceDataObject.action =='ConfigScaleOut' || referenceDataObject.action =='Configure'|| referenceDataObject.action =='' )" class="row">
+                            <div *ngIf="(referenceDataObject.action =='ConfigScaleOut' || referenceDataObject.action =='ConfigScaleIn' || referenceDataObject.action =='Configure'|| referenceDataObject.action =='' )" class="row">
                                 <div class="col-lg-2 col-md-2 hdden-sm-down">
                                     <label style="margin-top: 17px;" class="headlinesInBold"> Number Of VM(s): </label>
 
@@ -204,7 +204,7 @@
                             </div>
                             <div *ngIf="referenceDataObject.vm?.length>0">
                                 <div class="row" *ngFor="let noOfvm of referenceDataObject.vm  | vmFiltering:referenceDataObject?.action:templateIdentifier:vnfcIdentifier; trackBy:trackByFn;let j=index">
-                                   <div *ngIf="((referenceDataObject.action =='ConfigScaleOut' || referenceDataObject.action =='Configure'|| referenceDataObject.action =='' || referenceDataObject.action ==undefined ))" class="col-12">
+                                   <div *ngIf="((referenceDataObject.action =='ConfigScaleOut' || referenceDataObject.action =='ConfigScaleIn' || referenceDataObject.action =='Configure'|| referenceDataObject.action =='' || referenceDataObject.action ==undefined ))" class="col-12">
                                         <div class="row" *ngFor="let item of noOfvm.vnfc;trackBy:trackByFn, let i=index">
                                             <div class="col-md-12" *ngIf="i==0">
                                                 <h5 class="headlinesInBold">VM Number: {{j+1}}</h5>
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 8e3dc1b..15b3f99 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
@@ -372,8 +372,33 @@
         expect(component.referenceDataObject.action).toBe("ConfigScaleOut");
 
     });
+    it('configscalein test', () => {
+        service.latestAction = {
+            action: 'ConfigScaleIn',
+            'action-level': 'vnf',
+            scope: {
+                'vnf-type': '',
+                'vnfc-type': ''
+            },
+            'template': 'Y',
+            vm: [],
+            'device-protocol': '',
+            'user-name': '',
+            'port-number': '',
+            'artifact-list': []
+        }
+        service.referenceNameObjects = [
+            {
+                action: "Configure"
+            }, {
+                action: "StartApplication"
+            }
+        ]
+        component.ngOnInit()
+        expect(component.referenceDataObject.action).toBe("ConfigScaleIn");
 
-    it('shoud add vms with template id when the acti0on is configscaleout ', () => {
+    });
+    it('shoud add vms with template id when the action is configscaleout ', () => {
         component.referenceDataObject = {
             action: 'ConfigScaleOut',
             'action-level': 'vnf',
@@ -403,7 +428,37 @@
         component.addVms()
         expect(component.referenceDataObject.vm.length).toBe(4);
     });
-    it('shoud add vms with template id when the action is not configscaleout', () => {
+    it('shoud add vms with template id when the action is configscalein ', () => {
+        component.referenceDataObject = {
+            action: 'ConfigScaleIn',
+            'action-level': 'vnf',
+            scope: {
+                'vnf-type': '',
+                'vnfc-type-list': ['346']
+            },
+            'template': 'Y',
+            vm: [
+                {
+                    vnfc: [
+                        {
+                            test: "123"
+                        }
+                    ]
+
+                }
+            ],
+            'device-protocol': '',
+            'user-name': '',
+            'port-number': '',
+            'artifact-list': []
+        }
+
+        component.refernceScopeObj.from = "3"
+        // let arr = [1, 2];
+        component.addVms()
+        expect(component.referenceDataObject.vm.length).toBe(4);
+    });
+    it('shoud add vms with template id when the action is not configscaleout or configscalein', () => {
         component.referenceDataObject = {
             action: 'Config',
             'action-level': 'vnf',
@@ -591,6 +646,56 @@
 
     })
 
+    it("remove templateIds vm if action is configscalein", () => {
+        component.referenceDataObject = {
+            action: 'ConfigScaleIn',
+            'action-level': 'vnf',
+            scope: {
+                'vnf-type': '',
+                'vnfc-type-list': ['346']
+            },
+            'template': 'Y',
+            "vm": [
+                {
+                    "template-id": "klmklj",
+                    "vm-instance": 1,
+                    "vnfc": [
+                        {
+                            "vnfc-instance": "1",
+                            "vnfc-function-code": "klkl",
+                            "ipaddress-v4-oam-vip": "",
+                            "group-notation-type": "",
+                            "group-notation-value": "",
+                            "vnfc-type": "nnk"
+                        }
+                    ]
+                }, {
+                    "template-id": "test 12",
+                    "vm-instance": 2,
+                    "vnfc": [
+                        {
+                            "vnfc-instance": "1",
+                            "vnfc-function-code": "klkl",
+                            "ipaddress-v4-oam-vip": "",
+                            "group-notation-type": "",
+                            "group-notation-value": "",
+                            "vnfc-type": "nnk"
+                        }
+                    ]
+                }
+            ],
+            'device-protocol': '',
+            'user-name': '',
+            'port-number': '',
+            'artifact-list': []
+        };
+
+        component.removeFeature(0, 0, 'test 12')
+
+        //expect(component.referenceDataObject.vm.length).toBe(2)
+
+    })
+
     it("should add capabilities", () => {
         component.uploadedDataArray = [
             ['y', 'n']
@@ -693,6 +798,42 @@
 
         expect(component.referenceDataObject.vm.length).toBe(2)
     })
+    it("should switch vms if action is configscalein", () => {
+
+        component.currentAction = "ConfigScaleIn"
+        service.latestAction = {
+            action: 'OpenStack Actions',
+            'action-level': 'vnf',
+            scope: {
+                'vnf-type': '',
+                'vnfc-type': ''
+            },
+            'template': 'Y',
+            vm: [],
+            'device-protocol': '',
+            'user-name': '',
+            'port-number': '',
+            'artifact-list': []
+        }
+        service.referenceNameObjects = [
+            {
+                action: "Configure"
+            }, {
+                action: "StartApplication"
+            }
+        ]
+
+        component.tempAllData = [
+            {
+                action: "ConfigScaleIn",
+                vm: [{}, {}]
+            }
+        ]
+
+        component.prepareReferenceObject();
+
+        expect(component.referenceDataObject.vm.length).toBe(2)
+    })
     it("should switch vms if action is configscaleout", () => {
 
         component.currentAction = "ConfigScaleOut"
@@ -728,16 +869,61 @@
 
         expect(component.referenceDataObject.vm.length).toBe(0)
     })
+    it("should switch vms if action is configscalein", () => {
+
+        component.currentAction = "ConfigScaleIn"
+        service.latestAction = {
+            action: 'OpenStack Actions',
+            'action-level': 'vnf',
+            scope: {
+                'vnf-type': '',
+                'vnfc-type': ''
+            },
+            'template': 'Y',
+            vm: [],
+            'device-protocol': '',
+            'user-name': '',
+            'port-number': '',
+            'artifact-list': []
+        }
+        service.referenceNameObjects = [
+            {
+                action: "Configure"
+            }, {
+                action: "StartApplication"
+            }
+        ]
+
+        component.tempAllData = [
+            {
+                action: "startAplicaton"
+            }
+        ]
+
+        component.prepareReferenceObject();
+
+        expect(component.referenceDataObject.vm.length).toBe(0)
+    })
     it('shoud show template identifier when action is config scaleout', () => {
         let data = 'ConfigScaleOut'
         component.toggleIdentifier(data)
         expect(component.isConfigScaleOut).toBe(true);
     });
-    it('shoud show template identifier when action is config scaleout', () => {
+    it('shoud show template identifier when action is configscalein', () => {
+        let data = 'ConfigScaleIn'
+        component.toggleIdentifier(data)
+        expect(component.isConfigScaleIn).toBe(true);
+    });
+    it('shoud show template identifier when action is not configscaleout', () => {
         let data = 'startApplication'
         component.toggleIdentifier(data)
         expect(component.isConfigScaleOut).toBe(false);
     });
+    it('shoud show template identifier when action is not configscalein', () => {
+        let data = 'startApplication'
+        component.toggleIdentifier(data)
+        expect(component.isConfigScaleIn).toBe(false);
+    });
 
     it('Should call get artifact', () => {
 
@@ -1136,4 +1322,4 @@
     // afterEach(function() {
     //     jasmine.DEFAULT_TIMEOUT_INTERVAL = originalTimeout;
     // });
-});
\ No newline at end of file
+});
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 6223282..10a22fc 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
@@ -133,6 +133,7 @@
         , 'ConfigModify'
         , 'ConfigRestore'
         , 'ConfigScaleOut'
+        , 'ConfigScaleIn'
         , 'Configure'
         , 'DistributeTraffic'
         , 'DistributeTrafficCheck'
@@ -206,6 +207,7 @@
     public firstArrayElement = [];
     public remUploadedDataArray = [];
     isConfigScaleOut = false
+    isConfigScaleIn = false
     isConfigOrConfigModify = false
     displayVnfc = 'false';
     isVnfcType: boolean;
@@ -371,6 +373,12 @@
         } else {
             this.isConfigScaleOut = false
         }
+
+        if (data == 'ConfigScaleIn') {
+            this.isConfigScaleIn = true;
+        } else {
+            this.isConfigScaleIn = false;
+        }
     }
 
     //to retrive the data from appc and assign it to the vaiables, if no data display the message reterived from the API
@@ -396,6 +404,9 @@
                     if (this.referenceDataObject.action == 'ConfigScaleOut') {
                         this.groupAnotationType = ['', 'first-vnfc-name', 'fixed-value', 'relative-value', 'existing-group-name'];
                     }
+                    if (this.referenceDataObject.action == 'ConfigScaleIn') {
+                        this.groupAnotationType = ['', 'first-vnfc-name', 'fixed-value', 'relative-value', 'existing-group-name'];
+                    }
                     this.highlightSelectedActions(referenceDataAll)
                     
                     //chck vnfc or vnfcTypeList
@@ -598,21 +609,21 @@
         let key
         if (this.referenceDataObject.action == 'Configure' || this.referenceDataObject.action == 'ConfigModify' || this.referenceDataObject.action == 'DistributeTraffic' || this.referenceDataObject.action == 'DistributeTrafficCheck') {
             key = "vnfcType-id"
-        } else if (this.referenceDataObject.action == 'ConfigScaleOut') {
+        } else if (this.referenceDataObject.action == 'ConfigScaleOut' || this.referenceDataObject.action == 'ConfigScaleIn') {
             key = "template-id"
         }
-        if (this.referenceDataObject.action == 'ConfigScaleOut' || this.referenceDataObject.action == 'Configure' || this.referenceDataObject.action == 'ConfigModify' || this.referenceDataObject.action == 'DistributeTraffic' || this.referenceDataObject.action == 'DistributeTrafficCheck') {
+        if (this.referenceDataObject.action == 'ConfigScaleOut' || this.referenceDataObject.action == 'ConfigScaleIn' || this.referenceDataObject.action == 'Configure' || this.referenceDataObject.action == 'ConfigModify' || this.referenceDataObject.action == 'DistributeTraffic' || this.referenceDataObject.action == 'DistributeTrafficCheck') {
             let existingVmsLength = this.referenceDataObject.vm.map(obj => {
                 if (this.referenceDataObject.action == 'Configure' || this.referenceDataObject.action == 'ConfigModify' || this.referenceDataObject.action == 'DistributeTraffic' || this.referenceDataObject.action == 'DistributeTrafficCheck') {
                     return obj["vnfcType-id"] == this.templateIdentifier
-                } else if (this.referenceDataObject.action == 'ConfigScaleOut') {
+                } else if (this.referenceDataObject.action == 'ConfigScaleOut' || this.referenceDataObject.action == 'ConfigScaleIn') {
                     return obj["template-id"] == this.templateIdentifier
                 }
             }).length;
             //mberOFVm = existingVmsLength + mberOFVm;
             let index = 0;
             let identifierValue
-            if (this.referenceDataObject.action == 'ConfigScaleOut') {
+            if (this.referenceDataObject.action == 'ConfigScaleOut' || this.referenceDataObject.action == 'ConfigScaleIn') {
                 identifierValue = this.templateIdentifier
             } else if (this.referenceDataObject.action == 'Configure' || this.referenceDataObject.action == 'ConfigModify'  || this.referenceDataObject.action == 'DistributeTraffic' || this.referenceDataObject.action == 'DistributeTrafficCheck') {
                 identifierValue = this.vnfcIdentifier
@@ -627,7 +638,7 @@
                         this.referenceDataObject.vm.push({ 'vm-instance': (existingVmsLength + index + 1), vnfc: [Object.assign({}, this.Sample)] });
                     }
 
-                } else if (this.referenceDataObject.action == 'ConfigScaleOut') {
+                } else if (this.referenceDataObject.action == 'ConfigScaleOut' || this.referenceDataObject.action == 'ConfigScaleIn') {
                     if (identifierValue && identifierValue != "") {
                         this.referenceDataObject.vm.push({ 'template-id': identifierValue, 'vm-instance': (existingVmsLength + index + 1), vnfc: [Object.assign({}, this.Sample)] });
                     }
@@ -641,7 +652,7 @@
             let arrlength = this.referenceDataObject.vm.length;
             mberOFVm = arrlength + mberOFVm;
             for (var i = (arrlength); i < mberOFVm; i++) {
-                if (this.referenceDataObject.action == 'ConfigScaleOut') {
+                if (this.referenceDataObject.action == 'ConfigScaleOut' || this.referenceDataObject.action == 'ConfigScaleIn') {
                     this.referenceDataObject.vm.push({ 'template-id': this.templateIdentifier, 'vm-instance': (i + 1), vnfc: [Object.assign({}, this.Sample)] });
                 } else {
                     this.referenceDataObject.vm.push({ 'vm-instance': (i + 1), vnfc: [Object.assign({}, this.Sample)] });
@@ -1191,6 +1202,9 @@
         case 'ConfigScaleOut':
           this.deviceProtocols = ['', 'CHEF', 'ANSIBLE', 'NETCONF-XML', 'RESTCONF'];
           break;
+        case 'ConfigScaleIn':
+            this.deviceProtocols = ['', 'CHEF', 'ANSIBLE', 'NETCONF-XML', 'RESTCONF'];
+            break;
         case 'GetRunningConfig':
           this.deviceProtocols = ['', 'CHEF', 'ANSIBLE', 'NETCONF-XML', 'RESTCONF', 'CLI', 'REST'];
           break;
@@ -1272,7 +1286,7 @@
                     }
     
                     // Enable or Block Template and PD Tabs
-                    if (this.currentAction == 'ConfigScaleOut' && this.templateIdentifier && this.templateIdentifier != '') {
+                    if ((this.currentAction == 'ConfigScaleOut' || this.currentAction == 'ConfigScaleIn') && this.templateIdentifier && this.templateIdentifier != '') {
                         // let referenceDataObjectTemp = this.referenceDataObject;
                         // referenceDataObjectTemp['template-id'] = this.templateIdentifier;
                         // this.buildDesignComponent.getRefData(referenceDataObjectTemp);
@@ -1293,7 +1307,7 @@
             this.toggleIdentifier(data);
 
             // Enable or Block Template and PD Tabs
-            if(this.currentAction == 'ConfigScaleOut' && this.templateIdentifier) {
+            if((this.currentAction == 'ConfigScaleOut' || this.currentAction == 'ConfigScaleOut') && this.templateIdentifier) {
                 // let referenceDataObjectTemp = this.referenceDataObject;
                 // referenceDataObjectTemp['template-id'] = this.templateIdentifier;
                 // this.buildDesignComponent.getRefData(referenceDataObjectTemp);
@@ -1310,7 +1324,7 @@
 
     configDrp(data) {
         console.log( this.classNm+": configDrp: start: data:["+data+"]");
-        if (data == 'ConfigScaleOut') {
+        if (data == 'ConfigScaleOut' || data == 'ConfigScaleIn') {
             this.groupAnotationType = ['', 'first-vnfc-name', 'fixed-value', 'relative-value', 'existing-group-name'];
         } else {
             this.groupAnotationType = ['', 'first-vnfc-name', 'fixed-value', 'relative-value'];
@@ -1574,6 +1588,22 @@
         }
     }
 
+    resetVmsForScaleIn(action) {
+        //reset currentform vms based on action
+        if (action == "ConfigScaleIn" || action == "Configure") {
+            let ConfigScaleInIndex = this.tempAllData.findIndex(obj => {
+                return obj['action'] == action
+            });
+            if (ConfigScaleInIndex > -1) {
+                this.referenceDataObject.vm = this.tempAllData[ConfigScaleInIndex].vm
+            } else {
+                if (this.actionChanged) {
+                    this.referenceDataObject.vm = []
+                }
+            }
+        }
+    }
+
     resetParamsOnVnfcType() {
         let scopeName: any;
         let vnfcTypeList = this.referenceDataObject.scope['vnfc-type-list']
@@ -1660,7 +1690,7 @@
             configTemplate = this.referenceDataFormUtil.createConfigTemplate(config_template_fileName);
             pdTemplate = this.referenceDataFormUtil.createPdTemplate(pd_fileName);
             paramValue = this.referenceDataFormUtil.createParamValue(param_fileName);
-            if (this.referenceDataObject.action != 'ConfigScaleOut') {
+            if (this.referenceDataObject.action != 'ConfigScaleOut' && this.referenceDataObject.action != 'ConfigScaleIn') {
 
                 this.referenceDataObject['artifact-list'].push(configTemplate,
                     pdTemplate, paramValue
@@ -1692,21 +1722,22 @@
     // used to remove the added vms for actions other than configure & scaleout
     deleteVmsforNonActions(newObj, action) {
         let configureObject = (action == 'Configure');
-        let ConfigScaleOut = (action == 'ConfigScaleOut');
+        let ConfigScale = (action == 'ConfigScaleOut') || (action == 'ConfigScaleIn');
         //delete VM's if selected action is not configure.
-        if (!ConfigScaleOut && !configureObject && this.tempAllData.length != 0) {
-            if (ConfigScaleOut) {
+        if (!ConfigScale && !configureObject && this.tempAllData.length != 0) {
+            if (ConfigScale) {
             } else {
                 newObj.vm = [];
             }
         } else {
-            if (ConfigScaleOut) {
+            if (ConfigScale) {
             } else {
                 delete newObj['template-id-list'];
             }
         }
         return newObj
     }
+    
     // used to replace the data in tempall obj and form the artifact names
     pushOrReplaceTempData(newObj, action) {
         let configTemplate
@@ -1737,7 +1768,7 @@
                 pd_artifact: pdTemplate['pd_artifact'],
                 template_artifact: configTemplate['template_artifact']
             });
-        } else if (newObj.action == "ConfigScaleOut") {
+        } else if (newObj.action == "ConfigScaleOut" || newObj.action == "ConfigScaleIn") {
             let extension = this.referenceDataFormUtil.decideExtension(newObj);
             let pd_fileName = this.referenceDataObject.action + '_' + newObj.scope['vnf-type'].replace(/ /g, '').replace(new RegExp('/', 'g'), '_').replace(/ /g, '') + '_0.0.1V' + '_' + (this.templateIdentifier ? (this.templateIdentifier.replace(/ /g, '').replace(new RegExp('/', 'g'), '_').replace(/ /g, '')) : "") + ".yaml";
             let config_template_fileName = this.referenceDataObject.action + '_' + newObj.scope['vnf-type'].replace(/ /g, '').replace(new RegExp('/', 'g'), '_').replace(/ /g, '') + '_' + '0.0.1V_' + (this.templateIdentifier ? (this.templateIdentifier.replace(/ /g, '').replace(new RegExp('/', 'g'), '_').replace(/ /g, '') + '') : "") + extension;
@@ -1782,7 +1813,7 @@
         if (actionObjIndex > -1) {
             this.tempAllData[actionObjIndex] = newObj;
             this.mappingEditorService.saveLatestAction(this.tempAllData[actionObjIndex]);
-            if (newObj.action == "ConfigScaleOut") {
+            if (newObj.action == "ConfigScaleOut" || newObj.action == "ConfigScaleIn") {
                 this.mappingEditorService.saveLatestIdentifier(this.templateIdentifier);
             }
             else {
@@ -1795,7 +1826,7 @@
                 this.tempAllData.push(newObj);
                 this.mappingEditorService.saveLatestAction(newObj);
 
-                if (newObj.action == "ConfigScaleOut") {
+                if (newObj.action == "ConfigScaleOut" || newObj.action == "ConfigScaleIn") {
                     this.mappingEditorService.saveLatestIdentifier(this.templateIdentifier);
                 }
                 else {
@@ -1810,7 +1841,7 @@
         newObj = JSON.parse(JSON.stringify(newObj))
         delete newObj['template-id']
         delete newObj['vnfcIdentifier']
-        if (newObj.action != "ConfigScaleOut") {
+        if (newObj.action != "ConfigScaleOut" && newObj.action != "ConfigScaleIn") {
             delete newObj['template-id-list']
         }
         if (newObj.action != 'HealthCheck') {
@@ -1933,7 +1964,9 @@
             return;
         }
 
-        if (referenceDataObject.action === 'ConfigScaleOut' && !this.templateIdentifier) {
+        if ((referenceDataObject.action === 'ConfigScaleOut' 
+        || referenceDataObject.action === 'ConfigScaleIn') 
+        && !this.templateIdentifier) {
             this.nService.error('Error', 'Select a valid Template Identifier');
         }
 
@@ -1990,6 +2023,7 @@
     handleVMBlockDisplay() {
         switch (this.referenceDataObject.action) {
             case this.actionList.ConfigScaleOut:
+            case this.actionList.ConfigScaleIn:
             case this.actionList.Configure:
             case undefined:
             case '':
diff --git a/src/app/vnfs/build-artifacts/template-holder/param-name-value/param-name-value.component.html b/src/app/vnfs/build-artifacts/template-holder/param-name-value/param-name-value.component.html
index 55ea90f..3d11d5b 100644
--- a/src/app/vnfs/build-artifacts/template-holder/param-name-value/param-name-value.component.html
+++ b/src/app/vnfs/build-artifacts/template-holder/param-name-value/param-name-value.component.html
@@ -81,6 +81,9 @@
                         <div *ngIf="(action === 'ConfigScaleOut')" class="col-lg-3 col-sm-6 col-md-3 col-xs-12">
                             <label>Template Identifier</label><input class="form-control" type="text" disabled value="{{identifier}}" />
                         </div>
+                        <div *ngIf="(action === 'ConfigScaleIn')" class="col-lg-3 col-sm-6 col-md-3 col-xs-12">
+                            <label>Template Identifier</label><input class="form-control" type="text" disabled value="{{identifier}}" />
+                        </div>
                     </div>
                 </div>
             </div>
diff --git a/src/app/vnfs/build-artifacts/template-holder/template-configuration/template-configuration.component.html b/src/app/vnfs/build-artifacts/template-holder/template-configuration/template-configuration.component.html
index 67bce4d..7ca978f 100644
--- a/src/app/vnfs/build-artifacts/template-holder/template-configuration/template-configuration.component.html
+++ b/src/app/vnfs/build-artifacts/template-holder/template-configuration/template-configuration.component.html
@@ -54,6 +54,9 @@
                     <div *ngIf="(action === 'ConfigScaleOut')" class="col-lg-3 col-sm-6 col-md-3 col-xs-12">
                         <label>Template Identifier</label><input class="form-control" type="text" [(ngModel)]="identifier" disabled />
                     </div>
+                    <div *ngIf="(action === 'ConfigScaleIn')" class="col-lg-3 col-sm-6 col-md-3 col-xs-12">
+                        <label>Template Identifier</label><input class="form-control" type="text" [(ngModel)]="identifier" disabled />
+                    </div>
                 </div>
             </div>
         </div>
diff --git a/src/cdt.application.properties.json b/src/cdt.application.properties.json
index 61f9e1e..a47fe20 100644
--- a/src/cdt.application.properties.json
+++ b/src/cdt.application.properties.json
@@ -8,6 +8,7 @@
     "password": "admin",
     "Actions": {
         "ConfigScaleOut": "ConfigScaleOut",
+        "ConfigScaleIn": "ConfigScaleIn",
         "Configure": "Configure"
     },
     "versionNoForApiCall": "0.0.1"
diff --git a/src/constants/app-constants.ts b/src/constants/app-constants.ts
index 68ff6c4..b5c4ab2 100644
--- a/src/constants/app-constants.ts
+++ b/src/constants/app-constants.ts
@@ -71,7 +71,8 @@
         "upgradePreCheck": "UpgradePreCheck",
         "upgradeSoftware": "UpgradeSoftware",
         "openStackActions": "OpenStack Actions",
-        "configScaleOut": "ConfigScaleOut"
+        "configScaleOut": "ConfigScaleOut",
+        "configScaleIn": "ConfigScaleIn"
     },
     "DeviceProtocols": {
         "blank": '',