VoLTE support 27/46327/1
authorSonsino, Ofir (os0695) <os0695@intl.att.com>
Sun, 6 May 2018 10:31:32 +0000 (13:31 +0300)
committerSonsino, Ofir (os0695) <os0695@intl.att.com>
Sun, 6 May 2018 10:31:32 +0000 (13:31 +0300)
Change-Id: I593b9c92bf9330c2d28f2ccbd59c0651b67fe94a
Issue-ID: VID-189
Signed-off-by: Sonsino, Ofir (os0695) <os0695@intl.att.com>
18 files changed:
epsdk-app-onap/src/main/webapp/WEB-INF/conf/system.properties
epsdk-app-onap/src/main/webapp/WEB-INF/conf/system_template.properties
vid-app-common/src/main/java/org/onap/vid/aai/model/AaiGetTenatns/GetTenantsResponse.java
vid-app-common/src/main/java/org/onap/vid/asdc/beans/tosca/Input.java
vid-app-common/src/main/java/org/onap/vid/asdc/parser/ToscaParserImpl2.java
vid-app-common/src/main/java/org/onap/vid/controllers/MsoController.java
vid-app-common/src/main/java/org/onap/vid/mso/MsoBusinessLogic.java
vid-app-common/src/main/java/org/onap/vid/mso/MsoBusinessLogicImpl.java
vid-app-common/src/main/java/org/onap/vid/mso/MsoInterface.java
vid-app-common/src/main/java/org/onap/vid/mso/MsoProperties.java
vid-app-common/src/main/java/org/onap/vid/mso/rest/MsoRestClientNew.java
vid-app-common/src/main/webapp/app/vid/scripts/constants/componentConstants.js
vid-app-common/src/main/webapp/app/vid/scripts/controller/ServiceModelController.js
vid-app-common/src/main/webapp/app/vid/scripts/services/aaiService.js
vid-app-common/src/main/webapp/app/vid/scripts/services/creationService.js
vid-app-common/src/main/webapp/app/vid/scripts/services/dataService.js
vid-app-common/src/main/webapp/app/vid/scripts/services/utilityService.js
vid-app-common/src/test/java/org/onap/vid/bl/AaiServiceTest.java

index 2478804..c171ac0 100755 (executable)
@@ -159,6 +159,8 @@ mso.polling.interval.msecs=2000
 mso.max.polls=3\r
 mso.user.name=infraportal\r
 mso.password.x=OBF:1ghz1kfx1j1w1m7w1i271e8q1eas1hzj1m4i1iyy1kch1gdz\r
+#E2E is v3\r
+mso.restapi.svc.e2einstance=/e2eServiceInstances/v3\r
 mso.restapi.svc.instance=/serviceInstances/v6\r
 mso.restapi.vnf.instance=/serviceInstances/v6/<service_instance_id>/vnfs\r
 mso.restapi.network.instance=/serviceInstances/v6/<service_instance_id>/networks\r
index 06b2514..0f31f9a 100755 (executable)
@@ -102,6 +102,8 @@ mso.polling.interval.msecs=${MSO_POLLING_INTERVAL_MSECS}
 mso.max.polls=10\r
 mso.user.name=${VID_MSO_USER}\r
 mso.password.x=${VID_MSO_PASS}\r
+#E2E is v3\r
+mso.restapi.svc.e2einstance=/ecomp/mso/infra/e2eServiceInstances/v3\r
 mso.restapi.svc.instance=/ecomp/mso/infra/serviceInstances/v6\r
 mso.restapi.vnf.instance=/ecomp/mso/infra/serviceInstances/v6/<service_instance_id>/vnfs\r
 mso.restapi.network.instance=/ecomp/mso/infra/serviceInstances/v6/<service_instance_id>/networks\r
index bee9244..1d0e849 100644 (file)
@@ -12,6 +12,9 @@ public class GetTenantsResponse {
     @JsonProperty("cloudRegionID")
     public String cloudRegionId;
 
+    @JsonProperty("cloudOwner")
+    public String cloudOwner;
+    
     @JsonProperty("tenantName")
     public String tenantName;
 
@@ -24,8 +27,9 @@ public class GetTenantsResponse {
     public GetTenantsResponse() {
     }
 
-    public GetTenantsResponse(String cloudRegionId, String tenantName, String tenantID, boolean isPermitted) {
+    public GetTenantsResponse(String cloudRegionId, String cloudOwner, String tenantName, String tenantID, boolean isPermitted) {
         this.cloudRegionId = cloudRegionId;
+        this.cloudOwner = cloudOwner;
         this.tenantName = tenantName;
         this.tenantID = tenantID;
         this.isPermitted = isPermitted;
index 9f3ae42..6b2f39e 100644 (file)
@@ -49,6 +49,12 @@ public class Input {
        /** The required field. If not set, the default is true */
        private boolean required = true;
        
+       /** Details the inputs template */
+       private String templateName;
+       private String templateUUID;
+       private String templateInvariantUUID;
+       private String templateCustomizationUUID;
+       
        /**
         * Instantiates a new input.
         */
@@ -165,4 +171,36 @@ public class Input {
        public String toString() {
                return "type=" + type + ",description=" + description + ",default=" + _default;
        }
+
+    public String getTemplateName() {
+        return templateName;
+    }
+
+    public void setTemplateName(String templateName) {
+        this.templateName = templateName;
+    }
+
+    public String getTemplateUUID() {
+        return templateUUID;
+    }
+
+    public void setTemplateUUID(String templateUUID) {
+        this.templateUUID = templateUUID;
+    }
+
+    public String getTemplateInvariantUUID() {
+        return templateInvariantUUID;
+    }
+
+    public void setTemplateInvariantUUID(String templateInvariantUUID) {
+        this.templateInvariantUUID = templateInvariantUUID;
+    }
+
+    public String getTemplateCustomizationUUID() {
+        return templateCustomizationUUID;
+    }
+
+    public void setTemplateCustomizationUUID(String templateCustomizationUUID) {
+        this.templateCustomizationUUID = templateCustomizationUUID;
+    }
 }
index f0d056a..2200b79 100644 (file)
@@ -8,6 +8,7 @@ import org.onap.sdc.tosca.parser.impl.FilterType;
 import org.onap.sdc.tosca.parser.impl.SdcToscaParserFactory;
 import org.onap.sdc.tosca.parser.impl.SdcTypes;
 import org.onap.sdc.toscaparser.api.*;
+import org.onap.sdc.toscaparser.api.elements.Metadata;
 import org.onap.sdc.toscaparser.api.parameters.Input;
 
 import java.nio.file.Path;
@@ -238,7 +239,7 @@ public class ToscaParserImpl2 {
     private Map<String, org.onap.vid.asdc.beans.tosca.Input> inputsListToInputsMap(List<org.onap.sdc.toscaparser.api.parameters.Input> inputList) {
         Map<String, org.onap.vid.asdc.beans.tosca.Input> inputs = new HashMap<>();
         for (org.onap.sdc.toscaparser.api.parameters.Input input : inputList) {
-            inputs.put(input.getName(), convertInput(input, new org.onap.vid.asdc.beans.tosca.Input()));
+            inputs.put(input.getName(), convertInput(input, new org.onap.vid.asdc.beans.tosca.Input(), null));
         }
         return inputs;
     }
@@ -297,7 +298,7 @@ public class ToscaParserImpl2 {
             for (Input input: inputs){
                 if(input.getName().equals(key)){
                     org.onap.vid.asdc.beans.tosca.Input localInput = new org.onap.vid.asdc.beans.tosca.Input();
-                    localInput = convertInput(input, localInput);
+                    localInput = convertInput(input, localInput, nodeTemplate);
                     String name = property.getKey();
                     commandPropertyMap.put(name, extractCommands(name, key));
                     inputMap.put(name, localInput);
@@ -312,13 +313,23 @@ public class ToscaParserImpl2 {
         return inputKey.substring(inputKey.indexOf(":") + 1);
     }
 
-    private org.onap.vid.asdc.beans.tosca.Input convertInput(Input parserInput, org.onap.vid.asdc.beans.tosca.Input localInput){
+    private org.onap.vid.asdc.beans.tosca.Input convertInput(Input parserInput, org.onap.vid.asdc.beans.tosca.Input localInput, NodeTemplate nodeTemplate){
         localInput.setDefault(parserInput.getDefault());
         localInput.setDescription(parserInput.getDescription());
         localInput.setRequired(parserInput.isRequired());
         localInput.setType(parserInput.getType());
         localInput.setConstraints(parserInput.getConstraints());
 //        localInput.setentry_schema()
+        
+        //if inputs of inner nodeTemplate - tell its details
+        if(nodeTemplate != null) {
+            Metadata metadata = nodeTemplate.getMetaData();
+            localInput.setTemplateName(metadata.getValue("name"));
+            localInput.setTemplateUUID(metadata.getValue("UUID"));
+            localInput.setTemplateInvariantUUID(metadata.getValue("invariantUUID"));
+            localInput.setTemplateCustomizationUUID(metadata.getValue("customizationUUID"));
+        }
+        
         return localInput;
     }
 
index 420ae23..bbca06e 100644 (file)
@@ -43,6 +43,7 @@ import java.io.StringWriter;
 import java.text.DateFormat;
 import java.text.SimpleDateFormat;
 import java.util.Date;
+import java.util.LinkedHashMap;
 import java.util.List;
 
 //import java.util.UUID;
@@ -109,6 +110,27 @@ public class MsoController extends RestrictedBaseController {
         return (new ResponseEntity<>(w.getResponse(), HttpStatus.OK));
 
     }
+    
+    /**
+     * Creates the e2e svc instance.
+     *
+     * @param request the request
+     * @return the response entity
+     * @throws Exception the exception
+     */
+    @RequestMapping(value = "/mso_create_e2e_svc_instance", method = RequestMethod.POST)
+    public ResponseEntity<String> createE2eSvcInstance(HttpServletRequest request, @RequestBody LinkedHashMap<String, Object> mso_request) throws Exception {
+        String methodName = "createE2eSvcInstance";
+
+        LOGGER.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + " start");
+
+        // always return OK, the MSO status code is embedded in the body
+
+        MsoResponseWrapper w = msoBusinessLogic.createE2eSvcInstance(mso_request.get("requestDetails"));
+
+        return (new ResponseEntity<>(w.getResponse(), HttpStatus.OK));
+
+    }
 
     /**
      * Creates the vnf.
index 8db7c3c..f38a7fc 100644 (file)
@@ -16,6 +16,8 @@ public interface MsoBusinessLogic {
     // this function should get params from tosca and send them to instance at mso, then return success response.
     MsoResponseWrapper createSvcInstance(RequestDetails msoRequest) throws Exception;
 
+    MsoResponseWrapper createE2eSvcInstance(Object msoRequest) throws Exception;
+    
     MsoResponseWrapper createVnf(RequestDetails requestDetails, String serviceInstanceId) throws Exception;
 
     MsoResponseWrapper createNwInstance(RequestDetails requestDetails, String serviceInstanceId) throws Exception;
index 95b175a..f15c7e5 100644 (file)
@@ -82,6 +82,21 @@ public class MsoBusinessLogicImpl implements MsoBusinessLogic {
         return msoClientInterface.createSvcInstance(msoRequest, endpoint);
     }
 
+    @Override
+    public MsoResponseWrapper createE2eSvcInstance(Object msoRequest) throws Exception {
+        String methodName = "createE2eSvcInstance ";
+        logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + " start");
+
+        String endpoint;
+        try {
+            endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_E2E_SVC_INSTANCE);
+        } catch (Exception exception) {
+            throw exception;
+        }
+
+        return msoClientInterface.createE2eSvcInstance(msoRequest, endpoint);
+    }
+    
     void validateLineOfBusiness(RequestDetails requestDetails) {
 
         Object value = requestDetails.getAdditionalProperties();
index 2d09630..a847756 100644 (file)
@@ -17,6 +17,9 @@ public interface MsoInterface {
      * @throws Exception
      */
     MsoResponseWrapper createSvcInstance(RequestDetails requestDetails, String endpoint) throws Exception;
+    
+    //For VoLTE E2E services
+    MsoResponseWrapper createE2eSvcInstance(Object requestDetails, String endpoint) throws Exception;
 
     /**
      * will create a virtual network function using MSO service.
index 584e858..f6b3f94 100644 (file)
@@ -69,6 +69,9 @@ public class MsoProperties extends SystemProperties {
        /** The Constant MSO_PASSWORD. */
        public static final String MSO_PASSWORD = "mso.password.x";
        
+       /** The Constant MSO_REST_API_SVC_INSTANCE. */
+    public static final String MSO_REST_API_E2E_SVC_INSTANCE = "mso.restapi.svc.e2einstance"; // /e2eServiceInstances/v3
+       
        /** The Constant MSO_REST_API_SVC_INSTANCE. */
        public static final String MSO_REST_API_SVC_INSTANCE = "mso.restapi.svc.instance"; // /serviceInstances/v2
        
index 20f22af..c3deec3 100644 (file)
@@ -33,6 +33,14 @@ public class MsoRestClientNew extends RestMsoImplementation implements MsoInterf
 
         return createInstance(requestDetails, endpoint);
     }
+    
+    @Override
+    public MsoResponseWrapper createE2eSvcInstance(Object requestDetails, String endpoint) throws Exception {
+        String methodName = "createE2eSvcInstance ";
+        logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + " start");
+
+        return createInstance(requestDetails, endpoint);
+    }
 
     @Override
     public MsoResponseWrapper createVnf(RequestDetails requestDetails, String endpoint) throws Exception {
@@ -126,7 +134,7 @@ public class MsoRestClientNew extends RestMsoImplementation implements MsoInterf
     }
 
 
-    public MsoResponseWrapper createInstance(RequestDetails request, String path) throws Exception {
+    public MsoResponseWrapper createInstance(Object request, String path) throws Exception {
         String methodName = "createInstance";
         logger.debug(dateFormat.format(new Date()) + "<== " + methodName + " start");
 
index a9278c3..b08b2b1 100755 (executable)
@@ -25,7 +25,8 @@ appDS2
        .constant("COMPONENT", (function() {
     return {
     A_LA_CARTE : "a la carte",
-    CLOUD_REGION_ID : "cloudRegionID",
+       CLOUD_OWNER : "cloudOwner",
+       CLOUD_REGION_ID : "cloudRegionID",
     COMPONENT_STATUS : "ComponentStatus",
     CREATE_COMPONENT : "createComponent",
     DELETE_RESUME_COMPONENT : "deleteResumeComponent",
index 967a390..cbb9357 100755 (executable)
                                        \r
                                        var serviceModel = getServiceResponse.data;\r
                                        DataService.setServiceName(serviceModel.service.name);\r
-                                       \r
+\r
+                                       //VOLTE services need input list generated and macro style\r
+                                       DataService.setE2EService(false);\r
+                                       if(serviceModel.service.category === 'E2E Service') {\r
+                                               DataService.setE2EService(true);\r
+                                               DataService.setHideServiceFields(false);\r
+                                               VIDCONFIGURATION.MACRO_SERVICES.push(serviceModel.service.invariantUuid);\r
+                                       }\r
+\r
                                        DataService.setModelInfo(COMPONENT.SERVICE, {\r
                                                "modelInvariantId": serviceModel.service.invariantUuid,\r
                                                "modelVersion": serviceModel.service.version,\r
index 53a941b..4b1d771 100755 (executable)
@@ -378,6 +378,7 @@ var AaiService = function ($http, $log, PropertyService, UtilityService, COMPONE
 \r
                 for (var i = 0; i < aaiLcpCloudRegionTenants.length; i++) {\r
                     lcpCloudRegionTenants.push({\r
+                        "cloudOwner": aaiLcpCloudRegionTenants[i][COMPONENT.CLOUD_OWNER],\r
                         "cloudRegionId": aaiLcpCloudRegionTenants[i][COMPONENT.CLOUD_REGION_ID],\r
                         "tenantName": aaiLcpCloudRegionTenants[i][COMPONENT.TENANT_NAME],\r
                         "tenantId": aaiLcpCloudRegionTenants[i][COMPONENT.TENANT_ID],\r
index 56ec715..0e7dbe4 100755 (executable)
@@ -199,8 +199,8 @@ var CreationService = function($log, AaiService, AsdcService, DataService,VIDCON
     var getUserProvidedList = function() {\r
         var parameterList = [];\r
         var isUserProvidedNaming = false;\r
-        if ( (DataService.getModelInfo(_this.componentId).serviceEcompNaming != null)\r
-            && (DataService.getModelInfo(_this.componentId).serviceEcompNaming === "false") ) {\r
+        if ( ((DataService.getModelInfo(_this.componentId).serviceEcompNaming != null)\r
+            && (DataService.getModelInfo(_this.componentId).serviceEcompNaming === "false")) || DataService.getE2EService() ) {\r
             isUserProvidedNaming = true;\r
         }\r
 \r
@@ -228,8 +228,9 @@ var CreationService = function($log, AaiService, AsdcService, DataService,VIDCON
                         FIELD.PARAMETER.LCP_REGION_TEXT_HIDDEN,\r
                         FIELD.PARAMETER.TENANT_DISABLED\r
                     ]);\r
-                    parameterList = parameterList.concat([ getAicZonesParameter() ]);\r
-\r
+                    if(!DataService.getE2EService()) {\r
+                        parameterList = parameterList.concat([getAicZonesParameter()]);\r
+                    }\r
 \r
                 }else{\r
                     parameterList = parameterList.concat([ getServiceId(),\r
@@ -239,8 +240,11 @@ var CreationService = function($log, AaiService, AsdcService, DataService,VIDCON
                 }\r
             }\r
 \r
-            parameterList = parameterList.concat([ getProjectParameter() ]);\r
-            parameterList = parameterList.concat([ getOwningEntityParameter() ]);\r
+            if(!DataService.getE2EService()) {\r
+                parameterList = parameterList.concat([getProjectParameter()]);\r
+                parameterList = parameterList.concat([getOwningEntityParameter()]);\r
+            }\r
+\r
             //if service model has a pnf, add a PNF ID parameter\r
             if (DataService.getPnf()) {\r
                 parameterList = parameterList.concat([ FIELD.PARAMETER.PNF_ID ]);\r
@@ -516,7 +520,10 @@ var CreationService = function($log, AaiService, AsdcService, DataService,VIDCON
                 return "mso_create_nw_instance/"\r
                     + DataService.getServiceInstanceId();\r
             case COMPONENT.SERVICE:\r
-                return "mso_create_svc_instance";\r
+                if(DataService.getE2EService() === true)\r
+                    return "mso_create_e2e_svc_instance";\r
+                else\r
+                    return "mso_create_svc_instance";\r
             case COMPONENT.VNF:\r
                 return "mso_create_vnf_instance/"\r
                     + DataService.getServiceInstanceId();\r
@@ -531,11 +538,98 @@ var CreationService = function($log, AaiService, AsdcService, DataService,VIDCON
         }\r
     };\r
 \r
+    var getMsoE2ERequest = function(parameterList) {\r
+        var modelInfo = DataService.getModelInfo(_this.componentId);\r
+\r
+        //region id\r
+        var lcpRegion = getValueFromList(FIELD.ID.LCP_REGION, parameterList);\r
+        if (lcpRegion === FIELD.KEY.LCP_REGION_TEXT) {\r
+            lcpRegion = getValueFromList(FIELD.ID.LCP_REGION_TEXT,\r
+                parameterList);\r
+        }\r
+        var cloudOwner = _.find(DataService.getCloudRegionTenantList(), function(region){\r
+            return region.cloudRegionId === lcpRegion;\r
+        }).cloudOwner;\r
+\r
+        var params = [];\r
+        var displayInputs = modelInfo.displayInputs;\r
+        var groupBy = _.groupBy(displayInputs, "templateUUID");\r
+\r
+        _.forEach(groupBy, function(nodeTemplateInputs, nodeTemplateUUID) {\r
+            var reqParas = {};\r
+            var vfLocations = [];\r
+\r
+            nodeTemplateInputs.forEach(function(parameter){\r
+                if(parameter.type === 'vf_location') {\r
+                    var loc = {\r
+                        vnfProfileId: parameter.displayName,\r
+                        locationConstraints : {\r
+                            vimId: cloudOwner + '_' + lcpRegion\r
+                        }\r
+                    };\r
+                    vfLocations.push(loc);\r
+                } else if(parameter.type === 'sdn_controller') {\r
+                    if(parameter.value === undefined || parameter.value === null) {\r
+                        reqParas[parameter.name] = '';\r
+                    } else {\r
+                        reqParas[parameter.name] = parameter.value.value;\r
+                    }\r
+                } else {\r
+                    var name;\r
+                    _.forEach(displayInputs, function(item, key){\r
+                        if(item === parameter) {\r
+                            name = key;\r
+                        }\r
+                    });\r
+                    var value = _.find(parameterList, function(item){\r
+                        return item.id === name;\r
+                    }).value;\r
+                    reqParas[parameter.displayName] = value;\r
+                }\r
+            });\r
+\r
+            params.push({\r
+                resourceName: nodeTemplateInputs[0].templateName,\r
+                resourceInvariantUuid: nodeTemplateInputs[0].templateInvariantUUID,\r
+                resourceUuid: nodeTemplateInputs[0].templateUUID,\r
+                resourceCustomizationUuid: nodeTemplateInputs[0].templateCustomizationUUID,\r
+                parameters: {\r
+                    locationConstraints: vfLocations,\r
+                    //TODO resources: [],\r
+                    requestInputs: reqParas\r
+                }\r
+            });\r
+        });\r
+\r
+        var requestBody = {\r
+            service: {\r
+                name: getValueFromList(FIELD.ID.INSTANCE_NAME, parameterList),\r
+                description: modelInfo["description"],\r
+                serviceInvariantUuid: modelInfo["modelInvariantId"],\r
+                serviceUuid: modelInfo["modelNameVersionId"],\r
+                globalSubscriberId: DataService.getGlobalCustomerId(),\r
+                serviceType: getValueFromList(FIELD.ID.SERVICE_TYPE, parameterList) || modelInfo["serviceTypeName"],\r
+                parameters: {\r
+                    locationConstraints: [],\r
+                    resources: params,\r
+                    requestInputs: {} //TODO\r
+                }\r
+            }\r
+        };\r
+\r
+        return requestBody;\r
+    };\r
+\r
     var getMsoRequestDetails = function(parameterList) {\r
         console.log("getMsoRequestDetails invoked, parameterList="); console.log(JSON.stringify(parameterList,null,4));\r
         //console.log("getMsoRequestDetails invoked, DataService.getArbitraryParameters()=");\r
         //console.log(JSON.stringify(DataService.getArbitraryParameters(),null,4));\r
 \r
+        //VoLTE logic goes here\r
+        if(DataService.getE2EService() === true) {\r
+            return getMsoE2ERequest(parameterList);\r
+        }\r
+\r
         var modelInfo = DataService.getModelInfo(_this.componentId);\r
         var requestorloggedInId = DataService.getLoggedInUserId();\r
         var owningEntityId = getValueFromList(FIELD.ID.OWNING_ENTITY, parameterList);\r
index 716854e..77523e9 100755 (executable)
@@ -300,6 +300,12 @@ var DataService = function($log, DataService) {
                getArbitraryParameters : function () {\r
                        return _this.arbitraryParameters;\r
                },\r
+               setE2EService:function(b){\r
+                       _this.e2eService=b;\r
+               },\r
+               getE2EService:function(){\r
+                       return _this.e2eService;\r
+               },\r
                setHideServiceFields:function(b){\r
                        _this.hideServiceFields=b;\r
                },\r
index 8577e99..942bd79 100755 (executable)
@@ -156,6 +156,11 @@ var UtilityService = function($log, DataService, PARAMETER) {
                                                                                serviceModel.service.inputs[cmdObj.inputName] != null ) {\r
                                                                        networkModelDisplayInputs[cmdObj.inputName] = (serviceModel.service.inputs[cmdObj.inputName]);\r
                                                                        networkModelDisplayInputs[cmdObj.inputName][PARAMETER.DISPLAY_NAME] = cmdObj.displayName;\r
+                                                                       //E2E services need this\r
+                                                                       ["templateInvariantUUID", "templateCustomizationUUID", "templateUUID", "templateName"].forEach(function(templateProp) {\r
+                                                                               networkModelDisplayInputs[cmdObj.inputName][templateProp] = networkModel.inputs[cmdObj.displayName][templateProp];\r
+                                                                       });\r
+\r
                                                                }\r
                                                }\r
                                                                \r
@@ -237,6 +242,10 @@ var UtilityService = function($log, DataService, PARAMETER) {
                                                                                serviceModel.service.inputs[cmdObj.inputName] != null ) {\r
                                                                        vnfModelDisplayInputs[cmdObj.inputName] = (serviceModel.service.inputs[cmdObj.inputName]);\r
                                                                        vnfModelDisplayInputs[cmdObj.inputName][PARAMETER.DISPLAY_NAME] = cmdObj.displayName;\r
+                                                                       //E2E services need this\r
+                                                                       ["templateInvariantUUID", "templateCustomizationUUID", "templateUUID", "templateName"].forEach(function(templateProp) {\r
+                                                                               networkModelDisplayInputs[cmdObj.inputName][templateProp] = vnfModel.inputs[cmdObj.displayName][templateProp];\r
+                                                                       });\r
                                                                }\r
                                                }\r
                                                                \r
index b6990eb..e19bcbc 100644 (file)
@@ -129,7 +129,7 @@ public class AaiServiceTest {
     @Test(dataProvider = "getTenantsData")
     public void testGetTenants(String userGlobalCustomerId, String userServiceType, String userTenantName, String serviceGlobalCustomerId,
                                String serviceServiceType, String serviceTenantName, String serviceTenantId, boolean expectedIsPermitted) {
-        GetTenantsResponse[] getTenantsResponses = new GetTenantsResponse[] {new GetTenantsResponse(null, serviceTenantName, serviceTenantId, false)};
+        GetTenantsResponse[] getTenantsResponses = new GetTenantsResponse[] {new GetTenantsResponse(null, null, serviceTenantName, serviceTenantId, false)};
         AaiResponse<GetTenantsResponse[]> aaiResponse = new AaiResponse<>(getTenantsResponses, null, 200);
         Mockito.doReturn(aaiResponse).when(aaiClientInterface).getTenants(serviceGlobalCustomerId, serviceServiceType);
         Role role = new Role(null, userGlobalCustomerId, userServiceType, userTenantName);