Introduced dynamic workflow properties in VID FE 81/78681/5
authorgolabek <tomasz.golabek@nokia.com>
Thu, 14 Feb 2019 14:13:04 +0000 (15:13 +0100)
committergolabek <tomasz.golabek@nokia.com>
Fri, 22 Feb 2019 11:30:24 +0000 (12:30 +0100)
VID FE will get workflows from SO API (mocked at this moment),then call SO for the parameters and dynamically render those parameters on the
page.
(contains PR of @Wojciech Sliwka about mocked parameters API from SO)

Change-Id: If2cd156cd96a120e79746a4da44d4926f8d6cbcf
Issue-ID: VID-398
Signed-off-by: Tomasz Golabek <tomasz.golabek@nokia.com>
deliveries/src/main/docker/docker-files/docker-compose.yml
vid-app-common/src/main/java/org/onap/vid/controller/WebConfig.java
vid-app-common/src/main/java/org/onap/vid/model/SOWorkflows.kt
vid-app-common/src/main/webapp/app/vid/scripts/constants/componentConstants.js
vid-app-common/src/main/webapp/app/vid/scripts/modals/new-change-management/new-change-management.controller.js
vid-app-common/src/main/webapp/app/vid/scripts/modals/new-change-management/new-change-management.controller.test.js
vid-app-common/src/main/webapp/app/vid/scripts/modals/new-change-management/new-change-management.html
vid-app-common/src/main/webapp/app/vid/scripts/services/change-management.service.js

index e4bab26..8d321cf 100755 (executable)
@@ -1,37 +1,37 @@
-version: '3.2'\r
-\r
-# Please note this configuration is provided for local development. Do not use it on production.\r
-\r
-services:\r
-    vid-server:\r
-        image: onap/vid:latest\r
-        ports:\r
-            - "8080:8080"\r
-        environment:\r
-            VID_MYSQL_DBNAME: vid_openecomp_epsdk\r
-            VID_MYSQL_PASS: YOUR_PASSWORD\r
-            VID_MYSQL_HOST: vid-mariadb\r
-            ASDC_CLIENT_REST_PROTOCOL: http\r
-            ASDC_CLIENT_REST_HOST: vid-simulator\r
-            ASDC_CLIENT_REST_PORT: 1080\r
-            VID_AAI_URL: http://vid-simulator:1080\r
-            VID_MSO_SERVER_URL: http://vid-simulator:1080\r
-\r
-    vid-mariadb:\r
-        image: mariadb:10\r
-        ports:\r
-            - "3306:3306"\r
-        volumes:\r
-            - ../../../../../lf_config/vid-my.cnf:/etc/mysql/my.cnf\r
-            - /var/lib/mysql\r
-        environment:\r
-            MYSQL_DATABASE: vid_openecomp_epsdk\r
-            MYSQL_USER: vidadmin\r
-            MYSQL_PASSWORD: YOUR_PASSWORD\r
-            MYSQL_ROOT_PASSWORD: ROOT_PASSWORD\r
-\r
-    vid-simulator:\r
-        image: onap/vid-simulator:latest\r
-        ports:\r
-            - "9080:8080"\r
-            - "1080:1080"\r
+version: '3.2'
+
+# Please note this configuration is provided for local development. Do not use it on production.
+
+services:
+    vid-server:
+        image: onap/vid:latest
+        ports:
+            - "8080:8080"
+        environment:
+            VID_MYSQL_DBNAME: vid_openecomp_epsdk
+            VID_MYSQL_PASS: YOUR_PASSWORD
+            VID_MYSQL_HOST: vid-mariadb
+            ASDC_CLIENT_REST_PROTOCOL: http
+            ASDC_CLIENT_REST_HOST: vid-simulator
+            ASDC_CLIENT_REST_PORT: 1080
+            VID_AAI_URL: http://vid-simulator:1080
+            VID_MSO_SERVER_URL: http://vid-simulator:1080
+
+    vid-mariadb:
+        image: mariadb:10
+        ports:
+            - "3306:3306"
+        volumes:
+            - ../../../../../lf_config/vid-my.cnf:/etc/mysql/my.cnf
+            - /var/lib/mysql
+        environment:
+            MYSQL_DATABASE: vid_openecomp_epsdk
+            MYSQL_USER: vidadmin
+            MYSQL_PASSWORD: YOUR_PASSWORD
+            MYSQL_ROOT_PASSWORD: ROOT_PASSWORD
+
+    vid-simulator:
+        image: onap/vid-simulator:latest
+        ports:
+            - "9080:8080"
+            - "1080:1080"
index 8fe7c1f..2456ebd 100644 (file)
@@ -22,6 +22,7 @@
 package org.onap.vid.controller;
 
 import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.module.kotlin.KotlinModule;
 import io.joshworks.restclient.http.mapper.ObjectMapper;
 import org.onap.vid.aai.*;
 import org.onap.vid.aai.model.PortDetailsTranslator;
@@ -55,7 +56,7 @@ public class WebConfig {
      */
     @Bean
     public com.fasterxml.jackson.databind.ObjectMapper getObjectMapper() {
-        return new com.fasterxml.jackson.databind.ObjectMapper();
+        return new com.fasterxml.jackson.databind.ObjectMapper().registerModule(new KotlinModule());
     }
 
 
index 25125ce..82c720e 100644 (file)
@@ -1,21 +1,26 @@
 package org.onap.vid.model
 
-data class SOWorkflow @JvmOverloads constructor(var id: Long? = null, var name: String? = null) {
+data class SOWorkflow constructor(val id: Long, val name: String) {
     fun clone(): SOWorkflow {
         return copy()
     }
 }
 
-data class SOWorkflows @JvmOverloads constructor(var workflows: List<SOWorkflow>? = emptyList()) {
+data class SOWorkflows @JvmOverloads constructor(val workflows: List<SOWorkflow> = emptyList()) {
     fun clone(): SOWorkflows {
-        return copy(workflows?.toMutableList())
+        return copy(workflows.toMutableList())
     }
 }
 
-
-enum class SOWorkflowType(var type: String? = "STRING") {
+enum class SOWorkflowType(val type: String) {
     STRING("STRING")
 }
 
-data class SOWorkflowParameterDefinition(var id: Long? = null, var name: String? = null, var pattern: String? = null, var type: SOWorkflowType? = null, val required: Boolean? = null)
-data class SOWorkflowParameterDefinitions(var parameterDefinitions: List<SOWorkflowParameterDefinition>? = null)
\ No newline at end of file
+data class SOWorkflowParameterDefinition constructor(val id: Long, val name: String, val pattern: String,
+                                         val type: SOWorkflowType, val required: Boolean)
+
+data class SOWorkflowParameterDefinitions constructor(val parameterDefinitions: List<SOWorkflowParameterDefinition> = emptyList()) {
+    fun clone(): SOWorkflowParameterDefinitions {
+        return copy(parameterDefinitions.toMutableList())
+    }
+}
\ No newline at end of file
index 8ee2d06..dff51ee 100755 (executable)
@@ -116,6 +116,7 @@ appDS2
     CHANGE_MANAGEMENT_OPERATION_NO_SCHEDULER: "change-management/workflow/@vnfName",
     GET_WORKFLOW: "change-management/get_vnf_workflow_relation",
     GET_SO_WORKFLOWS: "workflows-management/workflows",
+    GET_SO_WORKFLOW_PARAMETER: "workflows-management/workflow-parameters/@workflowID",
     GET_MSO_WORKFLOWS: "change-management/mso",
     GET_SCHEDULER_CHANGE_MANAGEMENTS: "change-management/scheduler",
     CANCEL_SCHEDULE_REQUEST: "change-management/scheduler/schedules",
index 11f5cd6..c85f0fc 100644 (file)
@@ -43,6 +43,7 @@
 
         var init = function () {
             vm.changeManagement = {};
+            vm.changeManagement.workflowParameters = new Map();
 
             loadServicesCatalog();
             fetchAttUid().then(registerVNFNamesWatcher);
         vm.loadWorkFlows = function () {
           // Should be corrected when VID-397 will be closed. At the moment there is a need
           // to merge local and remote workflows not to broke current functionality.
-            return vm.loadLocalWorkFlows()
-            .then(vm.loadRemoteWorkFlows)
-            .then(function () {
-                vm.workflows = vm.localWorkflows.concat(vm.remoteWorkflows.map(item => item.name));
-            });
+          return vm.loadLocalWorkFlows()
+          .then(vm.loadRemoteWorkFlows)
+          .then(function () {
+            vm.workflows = vm.localWorkflows.concat(vm.remoteWorkflows.map(item => item.name));
+          }).then(function () {
+            vm.loadRemoteWorkFlowsParameters();
+          });
         };
 
         vm.loadLocalWorkFlows = function () {
           });
         };
 
+        vm.loadRemoteWorkFlowsParameters = function () {
+          vm.remoteWorkflowsParameters = new Map();
+          vm.remoteWorkflows.forEach(function(workflow) {
+            vm.loadRemoteWorkFlowParameters(workflow);
+          });
+        };
+
+        vm.loadRemoteWorkFlowParameters = function (workflow) {
+          changeManagementService.getSOWorkflowParameter(workflow.id)
+          .then(function (response) {
+            vm.remoteWorkflowsParameters.set(workflow.name, response.data.parameterDefinitions);
+          })
+          .catch(function (error) {
+            $log.error(error);
+          });
+        };
+
+        vm.getRemoteWorkFlowParameters = function (workflow) {
+          if (workflow && vm.remoteWorkflowsParameters.has(workflow)) {
+            return vm.remoteWorkflowsParameters.get(workflow)
+          }
+          return [];
+        };
+
         //Must be $scope because we bind to the onchange of the html (cannot attached to vm variable).
         $scope.selectFileForVNFName = function (fileInput) {
             if (fileInput && fileInput.id) {
 
         vm.isConfigUpdate = function () {
             return vm.changeManagement.workflow === COMPONENT.WORKFLOWS.vnfConfigUpdate;
-        }
+        };
 
         vm.isScaleOut = function () {
             return vm.changeManagement.workflow === COMPONENT.WORKFLOWS.vnfScaleOut;
-        }
+        };
 
         vm.shouldShowVnfInPlaceFields = function () {
             return vm.changeManagement.workflow === COMPONENT.WORKFLOWS.vnfInPlace;
index c4b9406..7f21dda 100644 (file)
@@ -50,7 +50,7 @@ describe('Testing workFlows from SO', () => {
     // when
     return $controller.loadRemoteWorkFlows()
     .then(() => {
-           remoteWorkflows = $controller.remoteWorkflows.map(item => item.name)
+           remoteWorkflows = $controller.remoteWorkflows.map(item => item.name);
            expect(remoteWorkflows).toContain('workflow 1');
            expect(remoteWorkflows).toContain('workflow 2');
         }
@@ -61,10 +61,12 @@ describe('Testing workFlows from SO', () => {
     // given
     let getWorkflowsStub = Promise.resolve({"data": {"workflows": ["workflow 0"]}});
     let getSOWorkflowsPromiseStub = Promise.resolve({"data": [{"id": "1", "name": "workflow 1"}, {"id": "2", "name": "workflow 2"}]});
+    let getSOWorkflowsParametersPromiseStub = Promise.resolve({"data":{"parameterDefinitions": []}});
 
     $controller.changeManagement.vnfNames = [{name: 'test1'}, {name: "test2"}];
     $changeManagementService.getWorkflows = () => getWorkflowsStub;
     $changeManagementService.getSOWorkflows = () =>  getSOWorkflowsPromiseStub;
+    $changeManagementService.getSOWorkflowParameter = () =>  getSOWorkflowsParametersPromiseStub;
     // when
     return $controller.loadWorkFlows().then(() => {
       expect($controller.workflows).toContain('workflow 0');
@@ -73,6 +75,29 @@ describe('Testing workFlows from SO', () => {
     });
   });
 
+  test('Verify load workflows will call load workflows parameters from SO', () => {
+    // given
+    let getWorkflowsStub = Promise.resolve({"data": {"workflows": ["workflow 0"]}});
+    let getSOWorkflowsPromiseStub = Promise.resolve({"data": [{"id": "1", "name": "workflow 0"}]});
+    let getSOWorkflowsParametersPromiseStub = Promise.resolve({"data":{"parameterDefinitions": [
+          {"id": 1, "name": "parameter 1", "required": true, "type": "STRING", "pattern": "[0-9]*"},
+          {"id": 2, "name": "parameter 2", "required": true, "type": "STRING", "pattern": ".*"},
+          {"id": 3, "name": "parameter 3", "required": false, "type": "STRING", "pattern": "[0-9]*"}]}});
+
+    $controller.changeManagement.vnfNames = [{name: 'test1'}, {name: "test2"}];
+    $changeManagementService.getWorkflows = () => getWorkflowsStub;
+    $changeManagementService.getSOWorkflows = () =>  getSOWorkflowsPromiseStub;
+    $changeManagementService.getSOWorkflowParameter = () =>  getSOWorkflowsParametersPromiseStub;
+    // when
+    return $controller.loadWorkFlows()
+    .then(() => {
+      expect($controller.remoteWorkflowsParameters).toEqual(new Map([["workflow 0",
+        [{"id": 1, "name": "parameter 1", "pattern": "[0-9]*", "required": true, "type": "STRING"},
+         {"id": 2, "name": "parameter 2", "pattern": ".*", "required": true, "type": "STRING"},
+         {"id": 3, "name": "parameter 3", "pattern": "[0-9]*", "required": false, "type": "STRING"}]]]));
+    });
+  });
+
   test('Verify broken SO workflows wont change content of local workflows', () => {
     // given
     let getWorkflowsStub = Promise.resolve({"data": {"workflows": ["workflow 0"]}});
index 21f9c5d..f83a267 100644 (file)
                 <label class="control-label">New software version</label>
                 <input class="form-control" ng-model="vm.changeManagement.newSoftwareVersion" name="newSoftwareVersion" type="text" id="new-software-version" pattern="{{vm.softwareVersionRegex}}" required>
             </div>
-
+        </div>
+        <div class="form-group" ng-if="vm.changeManagement.workflow" ng-repeat="item in vm.getRemoteWorkFlowParameters(vm.changeManagement.workflow)">
+          <label for="so-workflow-parameter-{{item.id}}" class="control-label">{{item.name}}</label>
+          <input class="form-control" ng-model="item.value" type="text" id="so-workflow-parameter-{{item.id}}" pattern="{{item.pattern}}" ng-required="{{item.required}}">
         </div>
     </div>
 
index 6998684..38b85f9 100644 (file)
             });
         };
 
+        this.getSOWorkflowParameter = function (workflowID){
+          return $http.get(COMPONENT.GET_SO_WORKFLOW_PARAMETER.replace('@workflowID', workflowID))
+          .success(function (response) {
+            return {data: response.parameterDefinitions}
+          });
+        };
+
         this.getMSOChangeManagements = function() {
             var deferred = $q.defer();