Sync local changes to support GRA microservice 75/125475/3
authorTimoney, Dan (dt5972) <dt5972@att.com>
Fri, 29 Oct 2021 18:47:40 +0000 (14:47 -0400)
committerDan Timoney <dtimoney@att.com>
Mon, 1 Nov 2021 14:17:41 +0000 (10:17 -0400)
Sync changes made downstream to support GRA microservice

Change-Id: If3bf5d879f7d61ab91209c63b0344d78128246a8
Issue-ID: CCSDK-3504
Signed-off-by: Dan Timoney <dtimoney@att.com>
124 files changed:
.gitignore
HOW_TO_MIGRATE_MDSAL.md [new file with mode: 0644]
ms/gra/gra-app/.swagger-codegen-ignore
ms/gra/gra-app/pom.xml
ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/FilterConfiguration.java
ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/GenericResourceMsApp.java
ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/GraWebConfiguration.java [new file with mode: 0644]
ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/ObjectMapperInterceptor.java [new file with mode: 0644]
ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/ObjectMapperResolver.java [new file with mode: 0644]
ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/UriMatcherObjectMapperResolver.java [new file with mode: 0644]
ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/controllers/ConfigApiController.java
ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/controllers/OperationsApiController.java
ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/controllers/ServiceDataHelper.java
ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/data/ConfigContrailRouteAllottedResources.java
ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/data/ConfigPortMirrorConfigurations.java
ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/data/ConfigServices.java
ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/data/OperationalContrailRouteAllottedResources.java
ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/data/OperationalPortMirrorConfigurations.java
ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/swagger/model/GenericResourceApiContrailRouteAllottedResources.java [new file with mode: 0644]
ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/swagger/model/GenericResourceApiContrailrouteallottedresourcesContrailRouteAllottedResource.java [new file with mode: 0644]
ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/swagger/model/GenericResourceApiContrailroutetopologyContrailRouteTopology.java [new file with mode: 0644]
ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/swagger/model/GenericResourceApiNetworkinstancegroupNetworkInstanceGroup.java [new file with mode: 0644]
ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/swagger/model/GenericResourceApiNetworkinstancegroupNetworkinstancegroupNetworksNetwork.java [new file with mode: 0644]
ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/swagger/model/GenericResourceApiNetworktopologyidentifierstructureNetworkTopologyIdentifierStructure.java [new file with mode: 0644]
ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/swagger/model/GenericResourceApiOnapmodelinformationOnapModelInformation.java [new file with mode: 0644]
ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/swagger/model/GenericResourceApiOperStatusData.java [new file with mode: 0644]
ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/swagger/model/GenericResourceApiPortMirrorConfigurations.java [new file with mode: 0644]
ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/swagger/model/GenericResourceApiPortmirrorconfigurationsPortMirrorConfiguration.java [new file with mode: 0644]
ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/swagger/model/GenericResourceApiPortmirrorconfigurationtopologyPortMirrorConfigurationTopology.java [new file with mode: 0644]
ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/swagger/model/GenericResourceApiPreloadModelInformation.java [new file with mode: 0644]
ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/swagger/model/GenericResourceApiPreloaddataPreloadData.java [new file with mode: 0644]
ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/swagger/model/GenericResourceApiPreloadmodelinformationPreloadList.java [new file with mode: 0644]
ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/swagger/model/GenericResourceApiPreloadnetworktopologyinformationPreloadNetworkTopologyInformation.java [new file with mode: 0644]
ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/swagger/model/GenericResourceApiServiceModelInfrastructure.java [new file with mode: 0644]
ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/swagger/model/GenericResourceApiServicedataServiceData.java [new file with mode: 0644]
ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/swagger/model/GenericResourceApiServicedataServicedataNetworks.java [new file with mode: 0644]
ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/swagger/model/GenericResourceApiServicedataServicedataNetworksNetwork.java [new file with mode: 0644]
ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/swagger/model/GenericResourceApiServicedataServicedataNetworksNetworkNetworkdataNetworkProvidedAllottedResources.java [new file with mode: 0644]
ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/swagger/model/GenericResourceApiServicedataServicedataVnfsVnf.java [new file with mode: 0644]
ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/swagger/model/GenericResourceApiServicedataServicedataVnfsVnfVnfData.java [new file with mode: 0644]
ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/swagger/model/GenericResourceApiServicedataServicedataVnfsVnfVnfdataVfmodulesVfModule.java [new file with mode: 0644]
ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/swagger/model/GenericResourceApiServicemodelinfrastructureService.java [new file with mode: 0644]
ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/swagger/model/GenericResourceApiServicestatusServiceStatus.java [new file with mode: 0644]
ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/swagger/model/GenericResourceApiServicetopologyServiceTopology.java [new file with mode: 0644]
ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/swagger/model/GenericResourceApiVfmoduletopologyVfModuleTopology.java [new file with mode: 0644]
ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/swagger/model/GenericResourceApiVnfNetworkData.java [new file with mode: 0644]
ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/swagger/model/GenericResourceApiVnfresourceassignmentsVnfresourceassignmentsVnfNetworks.java [new file with mode: 0644]
ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/swagger/model/GenericResourceApiVnftopologyVnfTopology.java [new file with mode: 0644]
ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/swagger/model/GenericResourceApiVpnbindingsVpnBindings.java [new file with mode: 0644]
ms/gra/gra-app/src/main/resources/application.properties
ms/gra/gra-app/src/main/resources/contrail-adaptor.properties [new file with mode: 0644]
ms/gra/gra-app/src/main/resources/contrail-api-path.properties [new file with mode: 0644]
ms/gra/gra-app/src/main/resources/db/changelog/db.changelog-master.yaml
ms/gra/gra-app/src/main/resources/eipam.properties [new file with mode: 0644]
ms/gra/gra-app/src/main/resources/log4j2.properties
ms/gra/gra-app/src/main/resources/msoadaptor.properties [new file with mode: 0644]
ms/gra/gra-app/src/test/java/org/onap/sdnc/apps/ms/gra/controllers/ConfigApiPreloadControllerTest.java
ms/gra/gra-app/src/test/java/org/onap/sdnc/apps/ms/gra/controllers/ConfigApiServicesControllerTest.java
ms/gra/gra-app/src/test/resources/GR_API.http
ms/gra/gra-app/src/test/resources/allotted-resource-item.json
ms/gra/gra-app/src/test/resources/contrail-adaptor.properties [new file with mode: 0644]
ms/gra/gra-app/src/test/resources/contrail-api-path.properties [new file with mode: 0644]
ms/gra/gra-app/src/test/resources/db/changelog/db.changelog-master.yaml
ms/gra/gra-app/src/test/resources/eipam.properties [new file with mode: 0644]
ms/gra/gra-app/src/test/resources/msoadaptor.properties [new file with mode: 0644]
ms/gra/gra-app/src/test/resources/port-mirror-configuration-item.json
ms/gra/gra-app/src/test/resources/preload1-net-list-item.json
ms/gra/gra-app/src/test/resources/preload1-net-model-info.json
ms/gra/gra-app/src/test/resources/preload1-net-preload-data.json
ms/gra/gra-app/src/test/resources/service1-service.json
ms/gra/gra-app/src/test/resources/service1-servicedata.json
ms/gra/gra-app/src/test/resources/service1-serviceitem.json
ms/gra/gra-app/src/test/resources/service1-services.json [new file with mode: 0644]
ms/gra/gra-app/src/test/resources/service1-servicestatus.json
ms/gra/gra-app/src/test/resources/service1-vfmodule-item.json
ms/gra/gra-app/src/test/resources/service1.json
ms/gra/gra-app/src/test/resources/vnf-level-oper-status.json
ms/gra/gra-app/src/test/resources/vnf-vnf-networks-network-role.json
ms/gra/gra-app/src/test/resources/vnf.json [new file with mode: 0644]
ms/gra/gra-docker/README.md [new file with mode: 0644]
ms/gra/gra-docker/pom.xml
ms/gra/gra-docker/src/main/dc/docker-compose.yaml
ms/gra/gra-docker/src/main/docker/Dockerfile
ms/gra/gra-docker/src/main/resources/application.properties
ms/gra/gra-docker/src/main/resources/contrail-adaptor.properties [new file with mode: 0644]
ms/gra/gra-docker/src/main/resources/contrail-api-path.properties [new file with mode: 0644]
ms/gra/gra-docker/src/main/resources/eipam.properties [new file with mode: 0644]
ms/gra/gra-docker/src/main/resources/generic-resource-api-dg.properties
ms/gra/gra-docker/src/main/resources/log4j2.properties
ms/gra/gra-docker/src/main/resources/msoadaptor.properties [new file with mode: 0644]
ms/gra/gra-docker/src/main/resources/startGra.sh
ms/gra/gra-docker/src/main/resources/truststore.jks [new file with mode: 0644]
ms/gra/gra-docker/src/main/scripts/chmodScripts.sh [new file with mode: 0644]
ms/gra/gra-docker/src/main/scripts/compareContrail.sh [new file with mode: 0755]
ms/gra/gra-docker/src/main/scripts/comparePortmirror.sh [new file with mode: 0755]
ms/gra/gra-docker/src/main/scripts/comparePreload.sh [new file with mode: 0755]
ms/gra/gra-docker/src/main/scripts/compareSvc.sh [new file with mode: 0755]
ms/gra/gra-docker/src/main/scripts/exportGraDaexim.sh [new file with mode: 0644]
ms/gra/gra-docker/src/main/scripts/graToMdsal.sh [new file with mode: 0644]
ms/gra/gra-docker/src/main/scripts/importGraDaexim.sh [new file with mode: 0755]
ms/gra/gra-docker/src/main/templates/contrail-route-allotted-resource.json [new file with mode: 0644]
ms/gra/gra-docker/src/main/templates/csm-service-instance.json [new file with mode: 0644]
ms/gra/gra-docker/src/main/templates/network-instance-group-network.json [new file with mode: 0644]
ms/gra/gra-docker/src/main/templates/network-level-oper-status.json [new file with mode: 0644]
ms/gra/gra-docker/src/main/templates/network.json [new file with mode: 0644]
ms/gra/gra-docker/src/main/templates/port-mirror-configuration.json [new file with mode: 0644]
ms/gra/gra-docker/src/main/templates/security-zone-allotted-resource.json [new file with mode: 0644]
ms/gra/gra-docker/src/main/templates/vf-module-assign.json [new file with mode: 0644]
ms/gra/gra-docker/src/main/templates/vnf-data-assign.json [new file with mode: 0644]
ms/gra/gra-docker/src/main/templates/vnf-level-oper-status.json [new file with mode: 0644]
ms/gra/gra-docker/src/main/templates/vnf-network.json [new file with mode: 0644]
ms/gra/pom.xml
ms/pom.xml
ms/sanity-test/pom.xml [new file with mode: 0644]
ms/sanity-test/sanity-test-app/.swagger-codegen-ignore [new file with mode: 0644]
ms/sanity-test/sanity-test-app/pom.xml [new file with mode: 0644]
ms/sanity-test/sanity-test-app/src/main/java/org/onap/sdnc/apps/ms/sanitytest/controllers/SanityTestOperationsApi.java [new file with mode: 0644]
ms/sanity-test/sanity-test-app/src/main/templates/api.mustache [new file with mode: 0644]
ms/sanity-test/sanity-test-app/src/main/yaml/sanitytest-api.yaml [new file with mode: 0644]
pom.xml
pomba/network-discovery-api/pom.xml
pomba/network-discovery/pom.xml
pomba/pom.xml
pomba/service-decomposition/pom.xml

index b1543de..05b593a 100644 (file)
@@ -14,3 +14,30 @@ ms/generic-resource-api/src/main/resources/GENERIC-RESOURCE-API*xml
 ms/generic-resource-api/src/main/resources/SUBNET-API*xml
 ms/generic-resource-api/src/main/resources/graph.versions
 .vscode
+org.eclipse.core.resources.prefs
+.externalToolBuilders
+maven-eclipse.xml
+workspace
+
+## Compilation Files ##
+*.class
+**/target
+target
+target-ide
+MANIFEST.MF
+
+## Misc Ignores (OS specific etc) ##
+bin/
+dist
+*~
+*.ipr
+*.iml
+*.iws
+classes
+out/
+.DS_STORE
+.metadata
+
+## Folders which contain auto generated source code ##
+yang-gen-config
+yang-gen-sal
diff --git a/HOW_TO_MIGRATE_MDSAL.md b/HOW_TO_MIGRATE_MDSAL.md
new file mode 100644 (file)
index 0000000..df45232
--- /dev/null
@@ -0,0 +1,48 @@
+## How to migrate GRA MD-SAL data between EOM and MCOM
+
+Scripts to migrate data from SDN-NFT EOM to SDN-NFT MCOM and to export data
+from MCOM to EOM are provided in ms/gra/gra-docker/src/main/scripts.
+
+### Migrate MD-SAL data from EOM to MCOM
+The importGraDaexim.sh script is used to import MD-SAL data
+saved using the OpenDaylight daexim feature.  The data from this script
+is loaded into the MCOM data via multiple "chunks", to work around limits
+in file size on posts to the Azure environment.  The shell variable
+CHUNK_SIZE can be used to adjust the number of entries included in each
+chunk.  This variable defaults to 75.
+
+The shell variables ODL_USER and ODL_PASSWORD must also be set to the
+mechid / password that should be used for transactions to SDN-NFT.
+
+The following are the steps to import MD-SAL data with the import script:
+1. Use daexim in EOM to export MD-SAL data. 
+2. Import exported data to MCOM using importGraDaexim.sh (in ms/gra/gra-docker/src/main/scripts)
+    export ODL_USER=<mechid>
+    export ODL_PASSWORD=<password for mechid>
+    importGraDaexim.sh <export-file-name> <controller-url>
+
+
+### Fallback MD-SAL data from MCOM to EOM
+The graToMdsal.sh script is used to migrate data from the SDN-NFT MCOM
+environment back to EOM. This script should be run in an environment
+that can:
+* Use kubectl to exec into the SDN-NFT GRA pod
+* Use curl to send https POST commands to SDN-NFT EOM
+
+This script uses the following environment variables:
+* NFT_AZURE_USER: SDN-NFT mech id (default: SDN-NFT non-prod mech id)
+* NFT_AZURE_PASSWORD:  SDN-NFT password (default:  SDN-NFT non-prod password)
+* NFT_EOM_USER : SDN-NFT EOM user (default: admin)
+* NFT_EOM_PASSWORD : SDN-NFT EOM password (default: admin)
+
+To use this script to copy MD-SAL data from SDN-NFT MCOM data back to SDN-NFT EOM:
+
+    graToMdsal.sh <nft-namespace> <gra pod name> <eom-url>
+
+
+
+    
+
+
+
+
index d8f3f67..4214416 100644 (file)
@@ -1,4 +1,35 @@
 **/OperationsApiController.java
 **/OperationalApiController.java
 **/ConfigApiController.java
+**/GenericResourceApiServicedataServicedataVnfsVnfVnfData.java
+**/GenericResourceApiServicemodelinfrastructureService.java
+**/GenericResourceApiServiceModelInfrastructure.java
 **/Swagger2SpringBoot.java
+**/GenericResourceApiPortmirrorconfigurationsPortMirrorConfiguration.java
+**/GenericResourceApiPortmirrorconfigurationtopologyPortMirrorConfigurationTopology.java
+**/GenericResourceApiContrailrouteallottedresourcesContrailRouteAllottedResource.java
+**/GenericResourceApiContrailroutetopologyContrailRouteTopology.java
+**/GenericResourceApiPreloadModelInformation.java
+**/GenericResourceApiPreloadnetworktopologyinformationPreloadNetworkTopologyInformation.java
+**/GenericResourceApiPreloadmodelinformationPreloadList.java
+**/GenericResourceApiPreloaddataPreloadData.java
+**/GenericResourceApiServicedataServiceData.java
+**/GenericResourceApiServicestatusServiceStatus.java
+**/GenericResourceApiServicedataServicedataVnfsVnf.java
+**/GenericResourceApiVnftopologyVnfTopology.java
+**/GenericResourceApiServicetopologyServiceTopology.java
+**/GenericResourceApiServicedataServicedataVnfsVnfVnfdataVfmodulesVfModule.java
+**/GenericResourceApiVfmoduletopologyVfModuleTopology.java
+**/GenericResourceApiNetworkinstancegroupNetworkInstanceGroup.java
+**/GenericResourceApiNetworkinstancegroupNetworkinstancegroupNetworksNetwork.java
+**/GenericResourceApiNetworktopologyidentifierstructureNetworkTopologyIdentifierStructure.java
+**/GenericResourceApiOnapmodelinformationOnapModelInformation.java
+**/GenericResourceApiOperStatusData.java
+**/GenericResourceApiServicedataServicedataNetworks.java
+**/GenericResourceApiServicedataServicedataNetworksNetwork.java
+**/GenericResourceApiServicedataServicedataNetworksNetworkNetworkdataNetworkProvidedAllottedResources.java
+**/GenericResourceApiVpnbindingsVpnBindings.java
+**/GenericResourceApiVnfresourceassignmentsVnfresourceassignmentsVnfNetworks.java
+**/GenericResourceApiVnfNetworkData.java
+**/GenericResourceApiContrailRouteAllottedResources.java
+**/GenericResourceApiPortMirrorConfigurations.java
index d122be5..e076644 100644 (file)
     </properties>
 
     <dependencies>
+        <dependency>
+            <groupId>org.onap.sdnc.apps</groupId>
+            <artifactId>sanity-test-app</artifactId>
+            <version>${project.version}</version>
+        </dependency>
         <dependency>
             <groupId>io.swagger</groupId>
             <artifactId>swagger-annotations</artifactId>
         </dependency>
-               <dependency>
-                       <groupId>org.springframework.boot</groupId>
-                       <artifactId>spring-boot-starter-web</artifactId>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
             <exclusions>
                 <exclusion>
                     <groupId>org.springframework.boot</groupId>
             <groupId>com.fasterxml.jackson.dataformat</groupId>
             <artifactId>jackson-dataformat-xml</artifactId>
         </dependency>
+        <!-- Needed by logging-analytics payload logging filter -->
+        <dependency>
+            <groupId>org.apache.cxf</groupId>
+            <artifactId>cxf-spring-boot-starter-jaxrs</artifactId>
+            <version>3.4.4</version>
+        </dependency>
         <dependency>
             <groupId>org.onap.aaf.authz</groupId>
             <artifactId>aaf-auth-client</artifactId>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-validation</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-actuator</artifactId>
+        </dependency>
         <dependency>
             <groupId>io.springfox</groupId>
             <artifactId>springfox-swagger2</artifactId>
             <version>1.6.2</version>
             <scope>test</scope>
         </dependency>
+
     </dependencies>
 
     <build>
                         </goals>
                         <configuration>
                             <sources>
-                                <source>${project.basedir}/target/generated-sources/src/main/java</source>
+                                <source>${basedir}/target/generated-sources/src/main/java</source>
                             </sources>
                         </configuration>
                     </execution>
index c054a1b..fb09cf8 100644 (file)
@@ -6,6 +6,8 @@ import java.io.IOException;
 import java.util.Properties;\r
 \r
 import org.onap.aaf.cadi.filter.CadiFilter;\r
+import org.onap.ccsdk.apps.filters.AuditLogFilter;\r
+import org.onap.ccsdk.apps.filters.PayloadLoggingFilter;\r
 import org.onap.ccsdk.sli.core.utils.common.EnvProperties;\r
 import org.slf4j.Logger;\r
 import org.slf4j.LoggerFactory;\r
@@ -17,23 +19,50 @@ import org.springframework.context.annotation.Configuration;
 import org.springframework.core.annotation.Order;\r
 \r
 @Configuration\r
-@ConditionalOnProperty("cadi.properties.path")\r
 public class FilterConfiguration {\r
 \r
-    private static final Logger log = LoggerFactory.getLogger(FilterConfiguration.class);\r
+       private static final Logger log = LoggerFactory.getLogger(FilterConfiguration.class);\r
 \r
-       @Value( "${cadi.properties.path:none}" )\r
+       // Explicitly add CadiFilter to filter chain. Note: autowiring already\r
+       // adds the filters defined in org.onap.ccsdk.apps.filters package, so do\r
+       // not need to explicitly insert them here.\r
+       @Value("${cadi.properties.path:none}")\r
        private String cadiPropFile;\r
 \r
        @Bean\r
        @Order(1)\r
+       public FilterRegistrationBean<PayloadLoggingFilter> loggingFilter() {\r
+               FilterRegistrationBean<PayloadLoggingFilter> registrationBean = new FilterRegistrationBean<>();\r
+\r
+               registrationBean.setFilter(new PayloadLoggingFilter());\r
+               registrationBean.addUrlPatterns("/config/*", "/operational/*", "/operations/*");\r
+\r
+               return registrationBean;\r
+       }\r
+\r
+       \r
+       @Bean\r
+       @Order(2)\r
+       public FilterRegistrationBean<AuditLogFilter> auditFilter() {\r
+               FilterRegistrationBean<AuditLogFilter> registrationBean = new FilterRegistrationBean<>();\r
+\r
+               registrationBean.setFilter(new AuditLogFilter());\r
+               registrationBean.addUrlPatterns("/config/*", "/operational/*", "/operations/*");\r
+\r
+               return registrationBean;\r
+       }\r
+\r
+\r
+       @Bean\r
+       @Order(3)\r
        public FilterRegistrationBean<CadiFilter> cadiFilter() {\r
-               CadiFilter filter = new CadiFilter();\r
                \r
+               CadiFilter filter = new CadiFilter();\r
+\r
                FilterRegistrationBean<CadiFilter> registrationBean = new FilterRegistrationBean<>();\r
                registrationBean.setFilter(filter);\r
-               if ("none".equals(cadiPropFile)) {\r
-            log.info("cadi.properties.path undefined, AAF CADI disabled");\r
+               if ("none".equals(cadiPropFile)){\r
+                       log.info(" AAF CADI disabled");\r
                        registrationBean.setEnabled(false);\r
                        registrationBean.addUrlPatterns("/xxxx/*");\r
                } else {\r
@@ -64,4 +93,6 @@ public class FilterConfiguration {
                return registrationBean;\r
        }\r
 \r
+\r
+\r
 }\r
index d436d21..9244ca4 100644 (file)
@@ -23,18 +23,26 @@ package org.onap.sdnc.apps.ms.gra;
 import org.onap.ccsdk.apps.ms.sliboot.controllers.RestconfApiController;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.boot.autoconfigure.domain.EntityScan;
+import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Import;
 import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
 import org.springframework.transaction.annotation.EnableTransactionManagement;
 
+import springfox.documentation.builders.ApiInfoBuilder;
+import springfox.documentation.builders.PathSelectors;
+import springfox.documentation.builders.RequestHandlerSelectors;
+import springfox.documentation.service.ApiInfo;
+import springfox.documentation.spi.DocumentationType;
+import springfox.documentation.spring.web.plugins.Docket;
 import springfox.documentation.swagger2.annotations.EnableSwagger2;
 
-@SpringBootApplication(scanBasePackages = { "org.onap.sdnc.apps.ms.gra", "org.onap.ccsdk.apps.services" })
-@EnableJpaRepositories(basePackages = { "org.onap.sdnc.apps.ms.gra", "org.onap.ccsdk.apps.ms.sliboot" })
-@EntityScan(basePackages = { "org.onap.sdnc.apps.ms.gra", "org.onap.ccsdk.apps.ms.sliboot" })
+@SpringBootApplication(scanBasePackages = { "org.onap.sdnc.apps.ms.gra", "org.onap.sdnc.apps.ms.sanitytest","org.onap.ccsdk.apps.services" })
+@EnableJpaRepositories(basePackages = { "org.onap.sdnc.apps.ms.gra", "org.onap.sdnc.apps.ms.sanitytest","org.onap.ccsdk.apps.ms.sliboot.data" })
+@EntityScan(basePackages = { "org.onap.sdnc.apps.ms.gra","org.onap.sdnc.apps.ms.sanitytest", "org.onap.ccsdk.apps.ms.sliboot.data", "org.onap.ccsdk.apps.ms.sliboot.controllers" })
 @EnableTransactionManagement
 @Import(RestconfApiController.class)
 @EnableSwagger2
@@ -43,7 +51,45 @@ public class GenericResourceMsApp {
 
     private static final Logger log = LoggerFactory.getLogger(GenericResourceMsApp.class);
 
+       @Value( "${swagger-ui.host:localhost}" )
+       private String swaggerUiHost;
+
+    @Value( "${swagger-ui.title:'SDNC : API Documentation'}" )
+    private String swaggerUiTitle;
+
+    @Value( "${swagger-ui.description:'SDNC : API Documentation'}" )
+    private String swaggerUiDescription;
+
+    @Bean
+    public Docket api() {
+        if (!"localhost".equalsIgnoreCase(swaggerUiHost)) {
+            return new Docket(DocumentationType.SWAGGER_2)
+                    .host(swaggerUiHost)
+                    .select()
+                    .apis(RequestHandlerSelectors.basePackage("org.onap")).paths(PathSelectors.any())
+                    .build()
+                    .apiInfo(apiInfo());
+        } else {
+            return new Docket(DocumentationType.SWAGGER_2)
+                    .select()
+                    .apis(RequestHandlerSelectors.basePackage("org.onap")).paths(PathSelectors.any())
+                    .build()
+                    .apiInfo(apiInfo());
+        }
+    }
+
+    private ApiInfo apiInfo() {
+        return new ApiInfoBuilder()
+               .title(swaggerUiTitle)
+               .description(swaggerUiDescription)
+               .build();
+    }
+
+
+
     public static void main(String[] args) throws Exception {
         SpringApplication.run(GenericResourceMsApp.class, args);
     }
+
+
 }
diff --git a/ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/GraWebConfiguration.java b/ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/GraWebConfiguration.java
new file mode 100644 (file)
index 0000000..8a3d5d0
--- /dev/null
@@ -0,0 +1,62 @@
+package org.onap.sdnc.apps.ms.gra;
+
+import java.util.List;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import org.springframework.aop.framework.ProxyFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.http.converter.HttpMessageConverter;
+import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
+import org.springframework.web.servlet.config.annotation.CorsRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+@Configuration
+public class GraWebConfiguration implements WebMvcConfigurer {
+
+    @Autowired
+    ObjectMapper objectMapper;
+
+    @Value("${swagger-ui.host:localhost}")
+    private String swaggerUiHost;
+
+    private ObjectMapper objectMapperProxy() {
+        ObjectMapperResolver objectMapperResolver = new UriMatcherObjectMapperResolver(objectMapper);
+        ProxyFactory factory = new ProxyFactory();
+        factory.setTargetClass(ObjectMapper.class);
+        factory.addAdvice(new ObjectMapperInterceptor() {
+
+            @Override
+            protected ObjectMapper getObject() {
+                return objectMapperResolver.getObjectMapper();
+            }
+
+        });
+
+        return (ObjectMapper) factory.getProxy();
+    }
+
+    @Bean
+    public MappingJackson2HttpMessageConverter jackson2HttpMessageConverter() {
+        return new MappingJackson2HttpMessageConverter(objectMapperProxy());
+    }
+
+    @Override
+    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
+        converters.add(jackson2HttpMessageConverter());
+
+    }
+
+    @Bean
+    public WebMvcConfigurer corsConfigurer() {
+        return new WebMvcConfigurer() {
+            @Override
+            public void addCorsMappings(CorsRegistry registry) {
+                registry.addMapping("/**").allowedOrigins("https://" + swaggerUiHost);
+            }
+        };
+    }
+}
diff --git a/ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/ObjectMapperInterceptor.java b/ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/ObjectMapperInterceptor.java
new file mode 100644 (file)
index 0000000..0de0da6
--- /dev/null
@@ -0,0 +1,21 @@
+package org.onap.sdnc.apps.ms.gra;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import org.aopalliance.intercept.MethodInterceptor;
+import org.aopalliance.intercept.MethodInvocation;
+import org.springframework.util.ReflectionUtils;
+
+public abstract class ObjectMapperInterceptor implements MethodInterceptor {
+
+    @Override
+    public Object invoke(MethodInvocation invocation) throws Throwable {
+      return ReflectionUtils.invokeMethod(invocation.getMethod(), getObject(), invocation.getArguments());
+    } 
+  
+    protected abstract ObjectMapper getObject();
+  
+}
+
+
+
diff --git a/ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/ObjectMapperResolver.java b/ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/ObjectMapperResolver.java
new file mode 100644 (file)
index 0000000..a6f897d
--- /dev/null
@@ -0,0 +1,7 @@
+package org.onap.sdnc.apps.ms.gra;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+public interface ObjectMapperResolver {
+  ObjectMapper getObjectMapper();
+}
diff --git a/ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/UriMatcherObjectMapperResolver.java b/ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/UriMatcherObjectMapperResolver.java
new file mode 100644 (file)
index 0000000..dc2cf51
--- /dev/null
@@ -0,0 +1,62 @@
+package org.onap.sdnc.apps.ms.gra;
+
+import javax.servlet.http.HttpServletRequest;
+
+import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.SerializationFeature;
+import com.fasterxml.jackson.annotation.JsonInclude;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+public class UriMatcherObjectMapperResolver implements ObjectMapperResolver {
+       private static final Logger log = LoggerFactory.getLogger(UriMatcherObjectMapperResolver.class);
+
+    private final ObjectMapper defaultMapper;
+    private final ObjectMapper wrappedMapper;
+    private final ObjectMapper unwrappedMapper;
+  
+    public UriMatcherObjectMapperResolver(ObjectMapper defaultMapper) {
+
+      defaultMapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY);
+      defaultMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
+      this.defaultMapper = defaultMapper;
+      this.wrappedMapper = defaultMapper.copy();
+      wrappedMapper.configure(SerializationFeature.WRAP_ROOT_VALUE, true);
+      wrappedMapper.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true);
+      this.unwrappedMapper = defaultMapper.copy();
+      unwrappedMapper.configure(SerializationFeature.WRAP_ROOT_VALUE, false);
+      unwrappedMapper.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, false);
+    }
+  
+    @Override
+    public ObjectMapper getObjectMapper() {
+      ServletRequestAttributes sra = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
+
+      if (sra == null) {
+        log.debug("Using default objectmapper based on null ServletRequestAttributes");
+        return(defaultMapper);
+      }
+      HttpServletRequest request = sra.getRequest();
+
+      String uri = request.getRequestURI();
+      if (uri.startsWith("/restconf/")) {
+        uri = uri.replaceFirst("/restconf/", "/");
+      }
+
+      if (uri.startsWith("/config/") || uri.startsWith("/operational/")) {
+        log.debug("Using wrapped objectmapper based on uri {}", uri);
+        return(wrappedMapper);
+      } else if (uri.startsWith("/operations/")) {
+        log.debug("Using unwrapper objectmapper based on uri {}", uri);
+        return(unwrappedMapper);
+      }
+      
+      log.debug("Using default objectmapper based on uri {}", uri);
+      return defaultMapper;
+    }
+  
+  }
index ac6a333..460bbce 100644 (file)
@@ -31,7 +31,9 @@ import javax.validation.Valid;
 
 import com.fasterxml.jackson.annotation.JsonInclude;
 import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.DeserializationFeature;
 import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.SerializationFeature;
 
 import org.onap.ccsdk.apps.services.RestApplicationException;
 import org.onap.ccsdk.apps.services.RestException;
@@ -50,11 +52,25 @@ import org.onap.sdnc.apps.ms.gra.data.ConfigVfModules;
 import org.onap.sdnc.apps.ms.gra.data.ConfigVfModulesRepository;
 import org.onap.sdnc.apps.ms.gra.data.ConfigVnfsRepository;
 import org.onap.sdnc.apps.ms.gra.swagger.ConfigApi;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiAggregateroutesAggregateRoutes;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiContrailRouteAllottedResources;
 import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiContrailrouteallottedresourcesContrailRouteAllottedResource;
 import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiContrailrouteallottedresourcesContrailrouteallottedresourceAllottedResourceData;
 import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiContrailroutetopologyContrailRouteTopology;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiNetworkInstanceGroup;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiNetworkinstancegroupNetworkInstanceGroup;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiNetworkinstancegroupNetworkinstancegroupAggregateRoutePolicy;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiNetworkinstancegroupNetworkinstancegroupNetworks;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiNetworkinstancegroupNetworkinstancegroupNetworksNetwork;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiNetworkinstancegroupNetworkinstancegroupNetworksNetworkCustomerBondingRequests;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiNetworkinstancegroupNetworkinstancegroupNetworksNetworkCustomerbondingrequestsCustomerBondingRequest;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiNetworkinstancegroupNetworkinstancegroupSubnetAssignmentPolicy;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiNetworkinstancegroupNetworkinstancegroupVpnBindingPolicy;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiNetworktopologyNetworkTopology;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiNetworktopologyidentifierstructureNetworkTopologyIdentifierStructure;
 import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiOnapmodelinformationOnapModelInformation;
 import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiOperStatusData;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiPortMirrorConfigurations;
 import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiPortmirrorconfigurationsPortMirrorConfiguration;
 import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiPortmirrorconfigurationsPortmirrorconfigurationConfigurationData;
 import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiPortmirrorconfigurationtopologyPortMirrorConfigurationTopology;
@@ -62,19 +78,28 @@ import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiPreloadModelInf
 import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiPreloaddataPreloadData;
 import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiPreloadmodelinformationPreloadList;
 import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiPreloadnetworktopologyinformationPreloadNetworkTopologyInformation;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiRelatedNetwork;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiRelatednetworkRelatedNetwork;
 import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiServiceModelInfrastructure;
 import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiServicedataServiceData;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiServicedataServicedataNetworks;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiServicedataServicedataNetworksNetwork;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiServicedataServicedataNetworksNetworkNetworkData;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiServicedataServicedataNetworksNetworkNetworkdataNetworkProvidedAllottedResources;
 import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiServicedataServicedataVnfsVnf;
 import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiServicedataServicedataVnfsVnfVnfData;
 import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiServicedataServicedataVnfsVnfVnfdataVfmodulesVfModule;
 import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiServicemodelinfrastructureService;
 import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiServicestatusServiceStatus;
 import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiServicetopologyServiceTopology;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiSubnetsSubnets;
 import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiVfmoduletopologyVfModuleTopology;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiVlantagsVlanTags;
 import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiVnfNetworkData;
 import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiVnfresourceassignmentsVnfResourceAssignments;
 import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiVnfresourceassignmentsVnfresourceassignmentsVnfNetworks;
 import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiVnftopologyVnfTopology;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiVpnbindingsVpnBindings;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -102,19 +127,19 @@ public class ConfigApiController implements ConfigApi {
 
     @Autowired
     private ConfigNetworksRepository configNetworksRepository;
-    
+
     @Autowired
     private ConfigVnfsRepository configVnfsRepository;
 
     @Autowired
     private ConfigVfModulesRepository configVfModulesRepository;
-    
+
     @Autowired
     private ConfigPortMirrorConfigurationsRepository configPortMirrorConfigurationsRepository;
 
     @Autowired
     private ConfigContrailRouteAllottedResourcesRepository configContrailRouteAllottedResourcesRepository;
-    
+
     @Autowired
     private ServiceDataHelper serviceDataHelper;
 
@@ -143,22 +168,25 @@ public class ConfigApiController implements ConfigApi {
     }
 
     /**
-     * Extracts port-mirror configuration data from CONFIG_GRA_PORT_MIRROR_CONFIGURATIONS for a given, configuration-id
+     * Extracts port-mirror configuration data from
+     * CONFIG_GRA_PORT_MIRROR_CONFIGURATIONS for a given, configuration-id
      * <p>
-     * Maps to /config/GENERIC-RESOURCE-API:port-mirror-configurations/port-mirror-configuration/{configuration-id}/
+     * Maps to
+     * /config/GENERIC-RESOURCE-API:port-mirror-configurations/port-mirror-configuration/{configuration-id}/
+     * 
      * @param configurationId the configuration ID for a port-mirror
      * @return HttpStatus.OK (200) if the data is found.
      * @throws RestException if the data does not exist.
      */
-    public ResponseEntity<GenericResourceApiPortmirrorconfigurationsPortMirrorConfiguration>
-                configGENERICRESOURCEAPIportMirrorConfigurationsPortMirrorConfigurationConfigurationIdGet(
-                    String configurationId) throws RestApplicationException {
+    public ResponseEntity<GenericResourceApiPortmirrorconfigurationsPortMirrorConfiguration> configGENERICRESOURCEAPIportMirrorConfigurationsPortMirrorConfigurationConfigurationIdGet(
+            String configurationId) throws RestApplicationException {
         GenericResourceApiPortmirrorconfigurationsPortMirrorConfiguration retval = null;
 
-        List<ConfigPortMirrorConfigurations> pmConfigurations = configPortMirrorConfigurationsRepository.findByConfigurationId(configurationId);
+        List<ConfigPortMirrorConfigurations> pmConfigurations = configPortMirrorConfigurationsRepository
+                .findByConfigurationId(configurationId);
 
         if (pmConfigurations.isEmpty()) {
-            log.info("No configuration data found with id [{}]",configurationId);
+            log.info("No configuration data found with id [{}]", configurationId);
             throw new RestApplicationException("data-missing",
                     "Request could not be completed because the relevant data model content does not exist",
                     HttpStatus.NOT_FOUND.value());
@@ -168,10 +196,13 @@ public class ConfigApiController implements ConfigApi {
             retval.setConfigurationId(configurationId);
             retval.setConfigurationStatus(pmConfiguration.getPortMirrorConfigurationStatus());
             try {
-                retval.setConfigurationData(objectMapper.readValue(pmConfiguration.getPmcData(), GenericResourceApiPortmirrorconfigurationsPortmirrorconfigurationConfigurationData.class));
+                retval.setConfigurationData(objectMapper.readValue(pmConfiguration.getPmcData(),
+                        GenericResourceApiPortmirrorconfigurationsPortmirrorconfigurationConfigurationData.class));
             } catch (JsonProcessingException e) {
                 log.error("Could not deserialize service data for service instance id {}", configurationId, e);
-                throw new RestApplicationException("data-conversion", "Request could not be completed due to internal error", e, HttpStatus.INTERNAL_SERVER_ERROR.value());
+                throw new RestApplicationException("data-conversion",
+                        "Request could not be completed due to internal error", e,
+                        HttpStatus.INTERNAL_SERVER_ERROR.value());
             }
         }
         return new ResponseEntity<>(retval, HttpStatus.OK);
@@ -179,15 +210,17 @@ public class ConfigApiController implements ConfigApi {
 
     @Override
     public ResponseEntity<Void> configGENERICRESOURCEAPIportMirrorConfigurationsPortMirrorConfigurationConfigurationIdPut(
-            String configurationId, @Valid GenericResourceApiPortmirrorconfigurationsPortMirrorConfiguration newConfiguration)
-                throws RestApplicationException {
+            String configurationId,
+            @Valid GenericResourceApiPortmirrorconfigurationsPortMirrorConfiguration newConfiguration)
+            throws RestApplicationException {
 
         boolean dataExists = false;
 
         String newConfigurationId = newConfiguration.getConfigurationId();
 
         ConfigPortMirrorConfigurations portMirrorConfiguration = null;
-        List<ConfigPortMirrorConfigurations> existingConfiguration = configPortMirrorConfigurationsRepository.findByConfigurationId(configurationId);
+        List<ConfigPortMirrorConfigurations> existingConfiguration = configPortMirrorConfigurationsRepository
+                .findByConfigurationId(configurationId);
         if ((existingConfiguration != null) && !existingConfiguration.isEmpty()) {
             dataExists = true;
             portMirrorConfiguration = existingConfiguration.get(0);
@@ -197,10 +230,14 @@ public class ConfigApiController implements ConfigApi {
         }
 
         try {
-            portMirrorConfiguration.setPmcData(objectMapper.writeValueAsString(newConfiguration.getConfigurationData()));
+            portMirrorConfiguration
+                    .setPmcData(objectMapper.writeValueAsString(newConfiguration.getConfigurationData()));
         } catch (JsonProcessingException e) {
-            log.error("Could not serialize porr-mirror configuration data for {}", portMirrorConfiguration.getConfigurationId(), e);
-            throw new RestApplicationException("data-conversion", "Request could not be completed due to internal error", e, HttpStatus.INTERNAL_SERVER_ERROR.value());
+            log.error("Could not serialize porr-mirror configuration data for {}",
+                    portMirrorConfiguration.getConfigurationId(), e);
+            throw new RestApplicationException("data-conversion",
+                    "Request could not be completed due to internal error", e,
+                    HttpStatus.INTERNAL_SERVER_ERROR.value());
 
         }
         portMirrorConfiguration.setPortMirrorConfigurationStatus(newConfiguration.getConfigurationStatus());
@@ -214,13 +251,14 @@ public class ConfigApiController implements ConfigApi {
     }
 
     @Override
-    public ResponseEntity<GenericResourceApiPortmirrorconfigurationtopologyPortMirrorConfigurationTopology>
-            configGENERICRESOURCEAPIportMirrorConfigurationsPortMirrorConfigurationConfigurationIdConfigurationDataPortMirrorConfigurationTopologyGet(
-                    String configurationId) throws RestApplicationException, RestProtocolException {
-        @Valid GenericResourceApiPortmirrorconfigurationtopologyPortMirrorConfigurationTopology portMirrorConfigurationTopology = null;
+    public ResponseEntity<GenericResourceApiPortmirrorconfigurationtopologyPortMirrorConfigurationTopology> configGENERICRESOURCEAPIportMirrorConfigurationsPortMirrorConfigurationConfigurationIdConfigurationDataPortMirrorConfigurationTopologyGet(
+            String configurationId) throws RestApplicationException, RestProtocolException {
+        @Valid
+        GenericResourceApiPortmirrorconfigurationtopologyPortMirrorConfigurationTopology portMirrorConfigurationTopology = null;
         GenericResourceApiPortmirrorconfigurationsPortmirrorconfigurationConfigurationData portMirrorConfigurationData = null;
 
-        List<ConfigPortMirrorConfigurations> configPortMirrorConfigurations = configPortMirrorConfigurationsRepository.findByConfigurationId(configurationId);
+        List<ConfigPortMirrorConfigurations> configPortMirrorConfigurations = configPortMirrorConfigurationsRepository
+                .findByConfigurationId(configurationId);
         if ((configPortMirrorConfigurations == null) || (configPortMirrorConfigurations.isEmpty())) {
             log.info("No configuration data found with id [{}]", configurationId);
             throw new RestApplicationException("data-missing",
@@ -229,51 +267,180 @@ public class ConfigApiController implements ConfigApi {
         }
 
         try {
-            if ( configPortMirrorConfigurations.get(0).getPmcData().isEmpty()) {
-                throw new RestProtocolException("data-missing", "No configuration-data entry found", HttpStatus.NOT_FOUND.value());
+            if (configPortMirrorConfigurations.get(0).getPmcData().isEmpty()) {
+                throw new RestProtocolException("data-missing", "No configuration-data entry found",
+                        HttpStatus.NOT_FOUND.value());
             } else {
-                portMirrorConfigurationData = objectMapper.readValue(configPortMirrorConfigurations.get(0).getPmcData(), GenericResourceApiPortmirrorconfigurationsPortmirrorconfigurationConfigurationData.class);
+                portMirrorConfigurationData = objectMapper.readValue(configPortMirrorConfigurations.get(0).getPmcData(),
+                        GenericResourceApiPortmirrorconfigurationsPortmirrorconfigurationConfigurationData.class);
                 portMirrorConfigurationTopology = portMirrorConfigurationData.getPortMirrorConfigurationTopology();
             }
             if (portMirrorConfigurationTopology == null) {
-                throw new RestProtocolException("data-missing", "No service-topology entry found", HttpStatus.NOT_FOUND.value());
+                throw new RestProtocolException("data-missing", "No service-topology entry found",
+                        HttpStatus.NOT_FOUND.value());
             }
             return new ResponseEntity<>(portMirrorConfigurationTopology, HttpStatus.OK);
         } catch (JsonProcessingException e) {
             log.error("Could not parse service data", e);
-            throw new RestApplicationException("data-conversion", "Request could not be completed due to internal error", e, HttpStatus.INTERNAL_SERVER_ERROR.value());
+            throw new RestApplicationException("data-conversion",
+                    "Request could not be completed due to internal error", e,
+                    HttpStatus.INTERNAL_SERVER_ERROR.value());
         }
     }
 
-
     @Override
-    public ResponseEntity<Void> configGENERICRESOURCEAPIportMirrorConfigurationsPortMirrorConfigurationConfigurationIdDelete(String configurationId) {
+    public ResponseEntity<Void> configGENERICRESOURCEAPIportMirrorConfigurationsPortMirrorConfigurationConfigurationIdDelete(
+            String configurationId) {
         configPortMirrorConfigurationsRepository.deleteByConfigurationId(configurationId);
         return new ResponseEntity<>(HttpStatus.NO_CONTENT);
     }
 
+    @Override
+    public ResponseEntity<Void> configGENERICRESOURCEAPIportMirrorConfigurationsPost(
+            @Valid GenericResourceApiPortMirrorConfigurations genericResourceApiPortMirrorConfigurationsBodyParam)
+            throws RestException {
+        boolean dataExists = false;
+
+        for (GenericResourceApiPortmirrorconfigurationsPortMirrorConfiguration portMirrorConfigItem : genericResourceApiPortMirrorConfigurationsBodyParam
+                .getPortMirrorConfiguration()) {
+            String configurationId = portMirrorConfigItem.getConfigurationId();
+            List<ConfigPortMirrorConfigurations> existingConfiguration = configPortMirrorConfigurationsRepository
+                    .findByConfigurationId(configurationId);
+            if ((existingConfiguration != null) && !existingConfiguration.isEmpty()) {
+
+                log.error("Port mirror configuration data already exists for {}", configurationId);
+                throw new RestProtocolException("data-exists",
+                        "Data already exists for configuration-id " + configurationId, HttpStatus.CONFLICT.value());
+            }
+            ConfigPortMirrorConfigurations portMirrorConfiguration = null;
+
+            if ((existingConfiguration != null) && !existingConfiguration.isEmpty()) {
+                dataExists = true;
+                portMirrorConfiguration = existingConfiguration.get(0);
+            } else {
+                portMirrorConfiguration = new ConfigPortMirrorConfigurations();
+                portMirrorConfiguration.setConfigurationId(configurationId);
+            }
+
+            try {
+                portMirrorConfiguration
+                        .setPmcData(objectMapper.writeValueAsString(portMirrorConfigItem.getConfigurationData()));
+            } catch (JsonProcessingException e) {
+                log.error("Could not serialize port-mirror configuration data for {}",
+                        portMirrorConfiguration.getConfigurationId(), e);
+                throw new RestApplicationException("data-conversion",
+                        "Request could not be completed due to internal error", e,
+                        HttpStatus.INTERNAL_SERVER_ERROR.value());
+
+            }
+            portMirrorConfiguration.setPortMirrorConfigurationStatus(portMirrorConfigItem.getConfigurationStatus());
+            configPortMirrorConfigurationsRepository.save(portMirrorConfiguration);
+
+        }
+
+        return new ResponseEntity<>(HttpStatus.CREATED);
+    }
+
+    
+    @Override
+    public ResponseEntity<GenericResourceApiPortMirrorConfigurations> configGENERICRESOURCEAPIportMirrorConfigurationsGet()
+            throws RestException {
+
+        if (configPortMirrorConfigurationsRepository.count() == 0) {
+            throw new RestApplicationException("data-missing",
+              "Request could not be completed because the relevant data model content does not exist",
+               HttpStatus.NOT_FOUND.value());
+        }
+        GenericResourceApiPortMirrorConfigurations retval = new GenericResourceApiPortMirrorConfigurations();
+
+        for (ConfigPortMirrorConfigurations pmConfiguration : configPortMirrorConfigurationsRepository.findAll()) {
+            GenericResourceApiPortmirrorconfigurationsPortMirrorConfiguration pmItem = new GenericResourceApiPortmirrorconfigurationsPortMirrorConfiguration();
+            pmItem.setConfigurationId(pmConfiguration.getConfigurationId());
+            pmItem.setConfigurationStatus(pmConfiguration.getPortMirrorConfigurationStatus());
+            try {
+                pmItem.setConfigurationData(objectMapper.readValue(pmConfiguration.getPmcData(),
+                        GenericResourceApiPortmirrorconfigurationsPortmirrorconfigurationConfigurationData.class));
+                retval.addPortMirrorConfigurationItem(pmItem);
+            } catch (JsonProcessingException e) {
+                log.error("Could not deserialize service data for service instance id {}", pmConfiguration.getConfigurationId(), e);
+                throw new RestApplicationException("data-conversion",
+                        "Request could not be completed due to internal error", e,
+                        HttpStatus.INTERNAL_SERVER_ERROR.value());
+            }
+        }
+
+        return new ResponseEntity<>(retval, HttpStatus.OK);
+    }
+
+    @Override
+    public ResponseEntity<Void> configGENERICRESOURCEAPIportMirrorConfigurationsPut(
+            @Valid GenericResourceApiPortMirrorConfigurations genericResourceApiPortMirrorConfigurationsBodyParam)
+            throws RestException {
+        boolean dataExists = false;
+
+        for (GenericResourceApiPortmirrorconfigurationsPortMirrorConfiguration portMirrorConfigItem : genericResourceApiPortMirrorConfigurationsBodyParam
+                .getPortMirrorConfiguration()) {
+            String configurationId = portMirrorConfigItem.getConfigurationId();
+            List<ConfigPortMirrorConfigurations> existingConfiguration = configPortMirrorConfigurationsRepository
+                    .findByConfigurationId(configurationId);
+
+            ConfigPortMirrorConfigurations portMirrorConfiguration = null;
+
+            if ((existingConfiguration != null) && !existingConfiguration.isEmpty()) {
+                dataExists = true;
+                portMirrorConfiguration = existingConfiguration.get(0);
+            } else {
+                portMirrorConfiguration = new ConfigPortMirrorConfigurations();
+                portMirrorConfiguration.setConfigurationId(configurationId);
+            }
+
+            try {
+                portMirrorConfiguration
+                        .setPmcData(objectMapper.writeValueAsString(portMirrorConfigItem.getConfigurationData()));
+            } catch (JsonProcessingException e) {
+                log.error("Could not serialize port-mirror configuration data for {}",
+                        portMirrorConfiguration.getConfigurationId(), e);
+                throw new RestApplicationException("data-conversion",
+                        "Request could not be completed due to internal error", e,
+                        HttpStatus.INTERNAL_SERVER_ERROR.value());
+
+            }
+            portMirrorConfiguration.setPortMirrorConfigurationStatus(portMirrorConfigItem.getConfigurationStatus());
+            configPortMirrorConfigurationsRepository.save(portMirrorConfiguration);
+
+        }
+
+        if (dataExists) {
+            return new ResponseEntity<>(HttpStatus.NO_CONTENT);
+        } else {
+            return new ResponseEntity<>(HttpStatus.CREATED);
+        }
+    }
+
     /**
-     * Extracts contrail-route-allotted-resource data from CONFIG_GRA_CONTRAIL_ROUTE_ALLOTTED_RESOURCES for a given allottedResourceId
+     * Extracts contrail-route-allotted-resource data from
+     * CONFIG_GRA_CONTRAIL_ROUTE_ALLOTTED_RESOURCES for a given allottedResourceId
      * <p>
-     * Maps to /config/GENERIC-RESOURCE-API:contrail-route-allotted-resources/contrail-route-allotted-resource/{allotted-resource-id}
+     * Maps to
+     * /config/GENERIC-RESOURCE-API:contrail-route-allotted-resources/contrail-route-allotted-resource/{allotted-resource-id}
+     * 
      * @param allottedResourceId the allotted-resource-id for a contrail-route
      * @return HttpStatus.OK (200) if the data is found.
      * @throws RestException if the data does not exist.
      */
-    public ResponseEntity<GenericResourceApiContrailrouteallottedresourcesContrailRouteAllottedResource>
-                configGENERICRESOURCEAPIcontrailRouteAllottedResourcesContrailRouteAllottedResourceAllottedResourceIdGet(
-                        String allottedResourceId) throws RestApplicationException {
+    public ResponseEntity<GenericResourceApiContrailrouteallottedresourcesContrailRouteAllottedResource> configGENERICRESOURCEAPIcontrailRouteAllottedResourcesContrailRouteAllottedResourceAllottedResourceIdGet(
+            String allottedResourceId) throws RestApplicationException {
         GenericResourceApiContrailrouteallottedresourcesContrailRouteAllottedResource retval = null;
 
-        List<ConfigContrailRouteAllottedResources> allottedResources = configContrailRouteAllottedResourcesRepository.findByAllottedResourceId(allottedResourceId);
+        List<ConfigContrailRouteAllottedResources> allottedResources = configContrailRouteAllottedResourcesRepository
+                .findByAllottedResourceId(allottedResourceId);
 
         if (allottedResources.isEmpty()) {
             log.info("No contrail-route-allotted-resource found with id [{}]", allottedResourceId);
             throw new RestApplicationException("data-missing",
                     "Request could not be completed because the relevant data model content does not exist",
                     HttpStatus.NOT_FOUND.value());
-        }
-        else {
+        } else {
             ConfigContrailRouteAllottedResources allottedResource = allottedResources.get(0);
             retval = new GenericResourceApiContrailrouteallottedresourcesContrailRouteAllottedResource();
             retval.setAllottedResourceId(allottedResourceId);
@@ -283,23 +450,29 @@ public class ConfigApiController implements ConfigApi {
                         GenericResourceApiContrailrouteallottedresourcesContrailrouteallottedresourceAllottedResourceData.class));
             } catch (JsonProcessingException e) {
                 log.error("Could not deserialize service data for service instance id {}", allottedResourceId, e);
-                throw new RestApplicationException("data-conversion", "Request could not be completed due to internal error", e, HttpStatus.INTERNAL_SERVER_ERROR.value());
+                throw new RestApplicationException("data-conversion",
+                        "Request could not be completed due to internal error", e,
+                        HttpStatus.INTERNAL_SERVER_ERROR.value());
             }
         }
         return new ResponseEntity<>(retval, HttpStatus.OK);
     }
 
     /**
-     * PUT contrail-route-allotted-resource data from CONFIG_GRA_CONTRAIL_ROUTE_ALLOTTED_RESOURCES for a given allottedResourceId
+     * PUT contrail-route-allotted-resource data from
+     * CONFIG_GRA_CONTRAIL_ROUTE_ALLOTTED_RESOURCES for a given allottedResourceId
      * <p>
-     * Maps to /config/GENERIC-RESOURCE-API:contrail-route-allotted-resources/contrail-route-allotted-resource/{allotted-resource-id}
+     * Maps to
+     * /config/GENERIC-RESOURCE-API:contrail-route-allotted-resources/contrail-route-allotted-resource/{allotted-resource-id}
+     * 
      * @param allottedResourceId the allotted-resource-id for a contrail-route
      * @return HttpStatus.OK (200) if the data is found.
      * @throws RestException if the data does not exist.
      */
     @Override
     public ResponseEntity<Void> configGENERICRESOURCEAPIcontrailRouteAllottedResourcesContrailRouteAllottedResourceAllottedResourceIdPut(
-            String allottedResourceId, @Valid GenericResourceApiContrailrouteallottedresourcesContrailRouteAllottedResource newAllottedResource)
+            String allottedResourceId,
+            @Valid GenericResourceApiContrailrouteallottedresourcesContrailRouteAllottedResource newAllottedResource)
             throws RestApplicationException {
 
         boolean dataExists = false;
@@ -307,8 +480,8 @@ public class ConfigApiController implements ConfigApi {
         String newAllottedResourceId = newAllottedResource.getAllottedResourceId();
 
         ConfigContrailRouteAllottedResources allottedResource = null;
-        List<ConfigContrailRouteAllottedResources> existingAllottedResource =
-                configContrailRouteAllottedResourcesRepository.findByAllottedResourceId(allottedResourceId);
+        List<ConfigContrailRouteAllottedResources> existingAllottedResource = configContrailRouteAllottedResourcesRepository
+                .findByAllottedResourceId(allottedResourceId);
 
         if ((existingAllottedResource != null) && !existingAllottedResource.isEmpty()) {
             dataExists = true;
@@ -321,8 +494,11 @@ public class ConfigApiController implements ConfigApi {
         try {
             allottedResource.setArData(objectMapper.writeValueAsString(newAllottedResource.getAllottedResourceData()));
         } catch (JsonProcessingException e) {
-            log.error("Could not serialize porr-mirror configuration data for {}", allottedResource.getAllottedResourceId(), e);
-            throw new RestApplicationException("data-conversion", "Request could not be completed due to internal error", e, HttpStatus.INTERNAL_SERVER_ERROR.value());
+            log.error("Could not serialize port-mirror configuration data for {}",
+                    allottedResource.getAllottedResourceId(), e);
+            throw new RestApplicationException("data-conversion",
+                    "Request could not be completed due to internal error", e,
+                    HttpStatus.INTERNAL_SERVER_ERROR.value());
 
         }
         allottedResource.setAllottedResourceStatus(newAllottedResource.getAllottedResourceStatus());
@@ -336,33 +512,37 @@ public class ConfigApiController implements ConfigApi {
     }
 
     /**
-     * Extracts contrail-route-topology data from CONFIG_GRA_CONTRAIL_ROUTE_ALLOTTED_RESOURCES for a given allottedResourceId
+     * Extracts contrail-route-topology data from
+     * CONFIG_GRA_CONTRAIL_ROUTE_ALLOTTED_RESOURCES for a given allottedResourceId
      * <p>
-     * Maps to /config/GENERIC-RESOURCE-API:contrail-route-allotted-resources/contrail-route-allotted-resource/{allotted-resource-id}/allotted-resource-data/contrail-route-topology/
+     * Maps to
+     * /config/GENERIC-RESOURCE-API:contrail-route-allotted-resources/contrail-route-allotted-resource/{allotted-resource-id}/allotted-resource-data/contrail-route-topology/
+     * 
      * @param allottedResourceId the allotted-resource-id for a contrail-route
      * @return HttpStatus.OK (200) if the data is found.
      * @throws RestException if the data does not exist.
      */
     @Override
-    public ResponseEntity<GenericResourceApiContrailroutetopologyContrailRouteTopology>
-            configGENERICRESOURCEAPIcontrailRouteAllottedResourcesContrailRouteAllottedResourceAllottedResourceIdAllottedResourceDataContrailRouteTopologyGet(
-                String allottedResourceId) throws RestApplicationException, RestProtocolException {
-        @Valid GenericResourceApiContrailroutetopologyContrailRouteTopology contrailRouteTopology = null;
+    public ResponseEntity<GenericResourceApiContrailroutetopologyContrailRouteTopology> configGENERICRESOURCEAPIcontrailRouteAllottedResourcesContrailRouteAllottedResourceAllottedResourceIdAllottedResourceDataContrailRouteTopologyGet(
+            String allottedResourceId) throws RestApplicationException, RestProtocolException {
+        @Valid
+        GenericResourceApiContrailroutetopologyContrailRouteTopology contrailRouteTopology = null;
         GenericResourceApiContrailrouteallottedresourcesContrailrouteallottedresourceAllottedResourceData allottedResourceData = null;
 
-        List<ConfigContrailRouteAllottedResources> configContrailRouteAllottedResources =
-                configContrailRouteAllottedResourcesRepository.findByAllottedResourceId(allottedResourceId);
+        List<ConfigContrailRouteAllottedResources> configContrailRouteAllottedResources = configContrailRouteAllottedResourcesRepository
+                .findByAllottedResourceId(allottedResourceId);
 
         if ((configContrailRouteAllottedResources == null) || (configContrailRouteAllottedResources.isEmpty())) {
-            log.info("No contrail-route-allotted-resoure data found with id [{}]", allottedResourceId);
+            log.info("No contrail-route-allotted-resource data found with id [{}]", allottedResourceId);
             throw new RestApplicationException("data-missing",
                     "Request could not be completed because the relevant data model content does not exist",
                     HttpStatus.NOT_FOUND.value());
         }
 
         try {
-            if ( configContrailRouteAllottedResources.get(0).getArData().isEmpty()) {
-                throw new RestProtocolException("data-missing", "No allotted-resource-data entry found", HttpStatus.NOT_FOUND.value());
+            if (configContrailRouteAllottedResources.get(0).getArData().isEmpty()) {
+                throw new RestProtocolException("data-missing", "No allotted-resource-data entry found",
+                        HttpStatus.NOT_FOUND.value());
             } else {
                 allottedResourceData = objectMapper.readValue(configContrailRouteAllottedResources.get(0).getArData(),
                         GenericResourceApiContrailrouteallottedresourcesContrailrouteallottedresourceAllottedResourceData.class);
@@ -370,20 +550,25 @@ public class ConfigApiController implements ConfigApi {
                 contrailRouteTopology = allottedResourceData.getContrailRouteTopology();
             }
             if (contrailRouteTopology == null) {
-                throw new RestProtocolException("data-missing", "No contrail-route-topology entry found", HttpStatus.NOT_FOUND.value());
+                throw new RestProtocolException("data-missing", "No contrail-route-topology entry found",
+                        HttpStatus.NOT_FOUND.value());
             }
             return new ResponseEntity<>(contrailRouteTopology, HttpStatus.OK);
         } catch (JsonProcessingException e) {
             log.error("Could not parse port-mirror-configuration data", e);
-            throw new RestApplicationException("data-conversion", "Request could not be completed due to internal error", e, HttpStatus.INTERNAL_SERVER_ERROR.value());
+            throw new RestApplicationException("data-conversion",
+                    "Request could not be completed due to internal error", e,
+                    HttpStatus.INTERNAL_SERVER_ERROR.value());
         }
     }
 
-
     /**
-     * DELETE allotted-resource data from CONFIG_GRA_CONTRAIL_ROUTE_ALLOTTED_RESOURCES for a given allottedResourceId
+     * DELETE allotted-resource data from
+     * CONFIG_GRA_CONTRAIL_ROUTE_ALLOTTED_RESOURCES for a given allottedResourceId
      * <p>
-     * Maps to /config/GENERIC-RESOURCE-API:contrail-route-allotted-resources/contrail-route-allotted-resource/{allotted-resource-id}
+     * Maps to
+     * /config/GENERIC-RESOURCE-API:contrail-route-allotted-resources/contrail-route-allotted-resource/{allotted-resource-id}
+     * 
      * @param allottedResourceId the allotted-resource-id for a contrail-route
      * @return HttpStatus.NO_CONTENT (204) if the data is found.
      */
@@ -394,6 +579,124 @@ public class ConfigApiController implements ConfigApi {
         return new ResponseEntity<>(HttpStatus.NO_CONTENT);
     }
 
+    
+
+    @Override
+    public ResponseEntity<GenericResourceApiContrailRouteAllottedResources> configGENERICRESOURCEAPIcontrailRouteAllottedResourcesGet()
+            throws RestException {
+                
+        if (configContrailRouteAllottedResourcesRepository.count() == 0) {
+             throw new RestApplicationException("data-missing",
+                "Request could not be completed because the relevant data model content does not exist",
+                HttpStatus.NOT_FOUND.value());
+        }
+
+        GenericResourceApiContrailRouteAllottedResources retval = new GenericResourceApiContrailRouteAllottedResources();
+        
+        for (ConfigContrailRouteAllottedResources allottedResource : configContrailRouteAllottedResourcesRepository.findAll()) {
+
+            GenericResourceApiContrailrouteallottedresourcesContrailRouteAllottedResource curItem = new GenericResourceApiContrailrouteallottedresourcesContrailRouteAllottedResource();
+            curItem.setAllottedResourceId(allottedResource.getAllottedResourceId());
+            curItem.setAllottedResourceStatus(allottedResource.getAllottedResourceStatus());
+            try {
+                curItem.setAllottedResourceData(objectMapper.readValue(allottedResource.getArData(),
+                        GenericResourceApiContrailrouteallottedresourcesContrailrouteallottedresourceAllottedResourceData.class));
+                retval.addContrailRouteAllottedResourceItem(curItem);
+            } catch (JsonProcessingException e) {
+                log.error("Could not deserialize service data for service instance id {}", allottedResource.getAllottedResourceId(), e);
+                throw new RestApplicationException("data-conversion",
+                        "Request could not be completed due to internal error", e,
+                        HttpStatus.INTERNAL_SERVER_ERROR.value());
+            }
+        }
+
+        return new ResponseEntity<>(retval, HttpStatus.OK);
+    }
+
+    @Override
+    public ResponseEntity<Void> configGENERICRESOURCEAPIcontrailRouteAllottedResourcesPost(
+            @Valid GenericResourceApiContrailRouteAllottedResources genericResourceApiContrailRouteAllottedResourcesBodyParam)
+            throws RestException {
+        for (GenericResourceApiContrailrouteallottedresourcesContrailRouteAllottedResource contrailItem : genericResourceApiContrailRouteAllottedResourcesBodyParam
+                .getContrailRouteAllottedResource()) {
+            String allottedResourceId = contrailItem.getAllottedResourceId();
+            List<ConfigContrailRouteAllottedResources> existingResources = configContrailRouteAllottedResourcesRepository
+                    .findByAllottedResourceId(allottedResourceId);
+
+            ConfigContrailRouteAllottedResources allottedResource = null;
+
+            if ((existingResources != null) && !existingResources.isEmpty()) {
+                log.error("Contrail route allotted resource data already exists for {}", allottedResourceId);
+                throw new RestProtocolException("data-exists",
+                        "Data already exists for allotted-resource-id " + allottedResourceId,
+                        HttpStatus.CONFLICT.value());
+            } else {
+                allottedResource = new ConfigContrailRouteAllottedResources();
+                allottedResource.setAllottedResourceId(allottedResourceId);
+            }
+
+            try {
+                allottedResource.setArData(objectMapper.writeValueAsString(contrailItem.getAllottedResourceData()));
+            } catch (JsonProcessingException e) {
+                log.error("Could not serialize porr-mirror configuration data for {}",
+                        allottedResource.getAllottedResourceId(), e);
+                throw new RestApplicationException("data-conversion",
+                        "Request could not be completed due to internal error", e,
+                        HttpStatus.INTERNAL_SERVER_ERROR.value());
+
+            }
+            allottedResource.setAllottedResourceStatus(contrailItem.getAllottedResourceStatus());
+            configContrailRouteAllottedResourcesRepository.save(allottedResource);
+
+        }
+
+        return new ResponseEntity<>(HttpStatus.CREATED);
+
+    }
+
+    @Override
+    public ResponseEntity<Void> configGENERICRESOURCEAPIcontrailRouteAllottedResourcesPut(
+            @Valid GenericResourceApiContrailRouteAllottedResources genericResourceApiContrailRouteAllottedResourcesBodyParam)
+            throws RestException {
+        boolean dataExists = false;
+
+        for (GenericResourceApiContrailrouteallottedresourcesContrailRouteAllottedResource contrailItem : genericResourceApiContrailRouteAllottedResourcesBodyParam
+                .getContrailRouteAllottedResource()) {
+            String allottedResourceId = contrailItem.getAllottedResourceId();
+            List<ConfigContrailRouteAllottedResources> existingResources = configContrailRouteAllottedResourcesRepository
+                    .findByAllottedResourceId(allottedResourceId);
+
+            ConfigContrailRouteAllottedResources allottedResource = null;
+
+            if ((existingResources != null) && !existingResources.isEmpty()) {
+                dataExists = true;
+                allottedResource = existingResources.get(0);
+            } else {
+                allottedResource = new ConfigContrailRouteAllottedResources();
+                allottedResource.setAllottedResourceId(allottedResourceId);
+            }
+
+            try {
+                allottedResource.setArData(objectMapper.writeValueAsString(contrailItem.getAllottedResourceData()));
+            } catch (JsonProcessingException e) {
+                log.error("Could not serialize porr-mirror configuration data for {}",
+                        allottedResource.getAllottedResourceId(), e);
+                throw new RestApplicationException("data-conversion",
+                        "Request could not be completed due to internal error", e,
+                        HttpStatus.INTERNAL_SERVER_ERROR.value());
+
+            }
+            allottedResource.setAllottedResourceStatus(contrailItem.getAllottedResourceStatus());
+            configContrailRouteAllottedResourcesRepository.save(allottedResource);
+
+        }
+
+        if (dataExists) {
+            return new ResponseEntity<>(HttpStatus.NO_CONTENT);
+        } else {
+            return new ResponseEntity<>(HttpStatus.CREATED);
+        }
+    }
 
     @Override
     public ResponseEntity<GenericResourceApiPreloadModelInformation> configGENERICRESOURCEAPIpreloadInformationGet()
@@ -450,11 +753,10 @@ public class ConfigApiController implements ConfigApi {
                         HttpStatus.INTERNAL_SERVER_ERROR.value());
             }
         }
-        
+
         return new ResponseEntity<>(netTopoInfo, HttpStatus.OK);
     }
 
-
     @Override
     public ResponseEntity<Void> configGENERICRESOURCEAPIpreloadInformationPost(
             @Valid GenericResourceApiPreloadModelInformation graPreloadModelInfo)
@@ -705,7 +1007,6 @@ public class ConfigApiController implements ConfigApi {
             String preloadId, String preloadType, @Valid GenericResourceApiPreloaddataPreloadData preloadData)
             throws RestApplicationException, RestProtocolException {
 
-
         List<ConfigPreloadData> preloadDataItems = configPreloadDataRepository.findByPreloadIdAndPreloadType(preloadId,
                 preloadType);
         if ((preloadDataItems == null) || (preloadDataItems.isEmpty())) {
@@ -815,7 +1116,6 @@ public class ConfigApiController implements ConfigApi {
                         HttpStatus.INTERNAL_SERVER_ERROR.value());
             }
 
-            
             if (serviceItemSvcData != null) {
                 serviceItem.setServiceData(serviceItemSvcData);
             }
@@ -827,9 +1127,10 @@ public class ConfigApiController implements ConfigApi {
     }
 
     @Override
-    public ResponseEntity<Void> configGENERICRESOURCEAPIservicesPost(@Valid GenericResourceApiServiceModelInfrastructure modelInfrastructure)
+    public ResponseEntity<Void> configGENERICRESOURCEAPIservicesPost(
+            @Valid GenericResourceApiServiceModelInfrastructure modelInfrastructure)
             throws RestApplicationException, RestProtocolException {
-        
+
         ServiceDataTransaction transaction = serviceDataHelper.createTransaction();
 
         for (GenericResourceApiServicemodelinfrastructureService serviceItem : modelInfrastructure.getService()) {
@@ -918,7 +1219,7 @@ public class ConfigApiController implements ConfigApi {
     @Override
     public ResponseEntity<Void> configGENERICRESOURCEAPIservicesServiceServiceInstanceIdDelete(
             String serviceInstanceId) {
-        serviceDataHelper.deleteService(serviceInstanceId);  
+        serviceDataHelper.deleteService(serviceInstanceId);
         return new ResponseEntity<>(HttpStatus.NO_CONTENT);
     }
 
@@ -1225,67 +1526,1951 @@ public class ConfigApiController implements ConfigApi {
     }
 
     /**
-     * Deletes VNF data from the Config table specified Service Instance.
+     * Delete network instance group data from the Config table specified Service
+     * Instance.
      * <p>
      * Maps to
-     * /config/GENERIC-RESOURCE-API:services/service/{service-instance-id}/service-data/vnfs/vnf/{vnf-id}/
+     * /config/GENERIC-RESOURCE-API:services/service/{service-instance-id}/service-data/network-instance-group/network-instance-group/{network-instance-group-id}/
      * 
-     * @param serviceInstanceId the Service Instance ID to perform the delete on
-     * @param vnfId             the VNF ID of the VNF to delete
-     * @return HttpStatus.NO_CONTENT (204) on successful delete
+     * @param serviceInstanceId      the Service Instance ID to delete from
+     * @param networkInstanceGroupId the network instance group ID to delete
+     * @return HttpStatus.OK (200) on successful GET
      *         <p>
-     *         HttpStatus.BAD_REQUEST (400) if unmarshalling Service Data from the
-     *         database fails, there is no VNF data for {@code vnfId}, or writing
-     *         Service Data back to the database fails.
+     *         HttpStatus.INTERNAL_SERVER_ERROR (500) if unmarshalling Service Data
+     *         from the database fails
      *         <p>
      *         HttpStatus.NOT_FOUND (404) if {@code serviceInstanceId} does not
      *         exist.
      */
-    @Override
-    public ResponseEntity<Void> configGENERICRESOURCEAPIservicesServiceServiceInstanceIdServiceDataVnfsVnfVnfIdDelete(
-            String serviceInstanceId, String vnfId) throws RestException {
-        log.info("DELETE | VNF Data for ({})", vnfId);
 
+    @Override
+    public ResponseEntity<Void> configGENERICRESOURCEAPIservicesServiceServiceInstanceIdServiceDataNetworkInstanceGroupsNetworkInstanceGroupNetworkInstanceGroupIdDelete(
+            String serviceInstanceId, String networkInstanceGroupId) throws RestException {
         List<ConfigServices> services = configServicesRepository.findBySvcInstanceId(serviceInstanceId);
-        ConfigServices data;
+
         if ((services == null) || (services.isEmpty())) {
-            log.info("Could not find data for ({}).", serviceInstanceId);
-            // Or throw the data not found error?
-            throw new RestProtocolException("data-missing", "Service Instance ID not found.",
-                    HttpStatus.NOT_FOUND.value());
-        } else {
-            data = services.get(0);
+            throw new RestProtocolException("data-missing", "No service entry found", HttpStatus.NOT_FOUND.value());
         }
 
-        if (!serviceDataHelper.hasServiceData(data)) {
-            log.info("Could not find Service Data for ({}).", serviceInstanceId);
-            throw new RestProtocolException("data-missing", "Service data not found.", HttpStatus.NOT_FOUND.value());
+        ConfigServices service = services.get(0);
+
+        if (service.getSvcData() == null) {
+            throw new RestProtocolException("data-missing", "No service-data found", HttpStatus.NOT_FOUND.value());
+        }
+        GenericResourceApiServicedataServiceData svcData = null;
+        try {
+            svcData = objectMapper.readValue(service.getSvcData(), GenericResourceApiServicedataServiceData.class);
+        } catch (JsonProcessingException e) {
+            log.error("Could not deserialize service data for svc instance id {}", serviceInstanceId, e);
+            throw new RestApplicationException("data-conversion",
+                    "Request could not be completed due to internal error", e,
+                    HttpStatus.INTERNAL_SERVER_ERROR.value());
         }
+        GenericResourceApiNetworkInstanceGroup curNetInstanceGroup = svcData.getNetworkInstanceGroups();
+        GenericResourceApiNetworkInstanceGroup newNetInstanceGroup = new GenericResourceApiNetworkInstanceGroup();
+
+        List<GenericResourceApiNetworkinstancegroupNetworkInstanceGroup> curList = curNetInstanceGroup
+                .getNetworkInstanceGroup();
+        if (curList != null) {
+            for (GenericResourceApiNetworkinstancegroupNetworkInstanceGroup curItem : curList) {
+                if (!networkInstanceGroupId.equals(curItem.getNetworkInstanceGroupId())) {
+                    newNetInstanceGroup.addNetworkInstanceGroupItem(curItem);
+                }
+            }
+        }
+        svcData.setNetworkInstanceGroups(newNetInstanceGroup);
+        try {
+            service.setSvcData(objectMapper.writeValueAsString(svcData));
+        } catch (JsonProcessingException e) {
 
-        if (serviceDataHelper.deleteVnf(serviceInstanceId, vnfId) > 0) {
-            return new ResponseEntity<>(HttpStatus.NO_CONTENT);
-        } else {
-            // Data was not found
-            log.error("Did not find VNF ({}) in data.", vnfId);
-            throw new RestProtocolException("data-missing", "VNF ID not found.", HttpStatus.NOT_FOUND.value());
+            log.error("Could not serialize service data for svc instance id {}", serviceInstanceId, e);
+            throw new RestApplicationException("data-conversion",
+                    "Request could not be completed due to internal error", e,
+                    HttpStatus.INTERNAL_SERVER_ERROR.value());
         }
+
+        configServicesRepository.save(service);
+
+        return new ResponseEntity<>(HttpStatus.NO_CONTENT);
     }
 
     /**
-     * Extracts VNF data from the Config table specified Service Instance.
+     * Get network instance group data from the Config table specified Service
+     * Instance.
      * <p>
      * Maps to
-     * /config/GENERIC-RESOURCE-API:services/service/{service-instance-id}/service-data/vnfs/vnf/{vnf-id}/
+     * /config/GENERIC-RESOURCE-API:services/service/{service-instance-id}/service-data/network-instance-group/network-instance-group/{network-instance-group-id}/
      * 
-     * @param serviceInstanceId the Service Instance ID to lookup data for
-     * @param vnfId             the VNF ID of the VNF to return
-     * @return HttpStatus.OK (200) if the data is found.
-     * @throws RestException if the data does not exist.
+     * @param serviceInstanceId      the Service Instance ID to get
+     * @param networkInstanceGroupId the network instance group ID to get
+     * @return HttpStatus.OK (200) on successful GET
+     *         <p>
+     *         HttpStatus.INTERNAL_SERVER_ERROR (500) if unmarshalling Service Data
+     *         from the database fails
+     *         <p>
+     *         HttpStatus.NOT_FOUND (404) if {@code serviceInstanceId} does not
+     *         exist.
      */
     @Override
-    public ResponseEntity<GenericResourceApiServicedataServicedataVnfsVnf> configGENERICRESOURCEAPIservicesServiceServiceInstanceIdServiceDataVnfsVnfVnfIdGet(
-            String serviceInstanceId, String vnfId) throws RestException {
-        log.info("GET | VNF Data for ({})", vnfId);
+    public ResponseEntity<GenericResourceApiNetworkinstancegroupNetworkInstanceGroup> configGENERICRESOURCEAPIservicesServiceServiceInstanceIdServiceDataNetworkInstanceGroupsNetworkInstanceGroupNetworkInstanceGroupIdGet(
+            String serviceInstanceId, String networkInstanceGroupId) throws RestException {
+        List<ConfigServices> services = configServicesRepository.findBySvcInstanceId(serviceInstanceId);
+
+        if ((services == null) || (services.isEmpty())) {
+            throw new RestProtocolException("data-missing", "No service entry found", HttpStatus.NOT_FOUND.value());
+        }
+
+        ConfigServices service = services.get(0);
+
+        if (service.getSvcData() == null) {
+            throw new RestProtocolException("data-missing", "No service-data found", HttpStatus.NOT_FOUND.value());
+        }
+        GenericResourceApiServicedataServiceData svcData = null;
+        try {
+            svcData = objectMapper.readValue(service.getSvcData(), GenericResourceApiServicedataServiceData.class);
+        } catch (JsonProcessingException e) {
+            log.error("Could not deserialize service data for svc instance id {}", serviceInstanceId, e);
+            throw new RestApplicationException("data-conversion",
+                    "Request could not be completed due to internal error", e,
+                    HttpStatus.INTERNAL_SERVER_ERROR.value());
+        }
+        GenericResourceApiNetworkInstanceGroup curNetInstanceGroup = svcData.getNetworkInstanceGroups();
+
+        if (curNetInstanceGroup == null) {
+            throw new RestProtocolException("data-missing", "No network-instance-group found",
+                    HttpStatus.NOT_FOUND.value());
+        }
+        List<GenericResourceApiNetworkinstancegroupNetworkInstanceGroup> curList = curNetInstanceGroup
+                .getNetworkInstanceGroup();
+
+        if (curList == null) {
+            throw new RestProtocolException("data-missing", "Empty network-instance-group ",
+                    HttpStatus.NOT_FOUND.value());
+        }
+
+        for (GenericResourceApiNetworkinstancegroupNetworkInstanceGroup curItem : curList) {
+            if (networkInstanceGroupId.equals(curItem.getNetworkInstanceGroupId())) {
+                return new ResponseEntity<>(curItem, HttpStatus.OK);
+            }
+        }
+
+        return new ResponseEntity<>(null, HttpStatus.OK);
+
+    }
+
+    /**
+     * Delete network instance group network data from the Config table specified
+     * Service Instance.
+     * <p>
+     * Maps to
+     * /config/GENERIC-RESOURCE-API:services/service/{service-instance-id}/service-data/network-instance-group/network-instance-group/{network-instance-group-id}/networks/network/{network-id}/
+     * 
+     * @param serviceInstanceId      the Service Instance ID to delete from
+     * @param networkInstanceGroupId the network instance group ID to delete
+     * @param networkId              the network ID to delete
+     * @return HttpStatus.OK (200) on successful GET
+     *         <p>
+     *         HttpStatus.INTERNAL_SERVER_ERROR (500) if unmarshalling Service Data
+     *         from the database fails
+     *         <p>
+     *         HttpStatus.NOT_FOUND (404) if {@code serviceInstanceId} does not
+     *         exist.
+     */
+    @Override
+    public ResponseEntity<Void> configGENERICRESOURCEAPIservicesServiceServiceInstanceIdServiceDataNetworkInstanceGroupsNetworkInstanceGroupNetworkInstanceGroupIdNetworksNetworkNetworkIdDelete(
+            String serviceInstanceId, String networkInstanceGroupId, String networkId) throws RestException {
+        List<ConfigServices> services = configServicesRepository.findBySvcInstanceId(serviceInstanceId);
+
+        if ((services == null) || (services.isEmpty())) {
+            throw new RestProtocolException("data-missing", "No service entry found", HttpStatus.NOT_FOUND.value());
+        }
+
+        ConfigServices service = services.get(0);
+
+        if (service.getSvcData() == null) {
+            throw new RestProtocolException("data-missing", "No service-data found", HttpStatus.NOT_FOUND.value());
+        }
+        GenericResourceApiServicedataServiceData svcData = null;
+        try {
+            svcData = objectMapper.readValue(service.getSvcData(), GenericResourceApiServicedataServiceData.class);
+        } catch (JsonProcessingException e) {
+            log.error("Could not deserialize service data for svc instance id {}", serviceInstanceId, e);
+            throw new RestApplicationException("data-conversion",
+                    "Request could not be completed due to internal error", e,
+                    HttpStatus.INTERNAL_SERVER_ERROR.value());
+        }
+        GenericResourceApiNetworkInstanceGroup curNetInstanceGroup = svcData.getNetworkInstanceGroups();
+
+        List<GenericResourceApiNetworkinstancegroupNetworkInstanceGroup> curList = curNetInstanceGroup
+                .getNetworkInstanceGroup();
+        if (curList != null) {
+            for (GenericResourceApiNetworkinstancegroupNetworkInstanceGroup curItem : curList) {
+                if (networkInstanceGroupId.equals(curItem.getNetworkInstanceGroupId())) {
+                    GenericResourceApiNetworkinstancegroupNetworkinstancegroupNetworks curNetworks = curItem
+                            .getNetworks();
+                    GenericResourceApiNetworkinstancegroupNetworkinstancegroupNetworks newNetworks = new GenericResourceApiNetworkinstancegroupNetworkinstancegroupNetworks();
+                    List<GenericResourceApiNetworkinstancegroupNetworkinstancegroupNetworksNetwork> curNetList = curNetworks
+                            .getNetwork();
+                    for (GenericResourceApiNetworkinstancegroupNetworkinstancegroupNetworksNetwork curNetListItem : curNetList) {
+                        if (!networkId.equals(curNetListItem.getNetworkId())) {
+                            newNetworks.addNetworkItem(curNetListItem);
+                        }
+                    }
+                    curItem.setNetworks(newNetworks);
+                }
+            }
+
+        }
+        try {
+            service.setSvcData(objectMapper.writeValueAsString(svcData));
+        } catch (JsonProcessingException e) {
+
+            log.error("Could not serialize service data for svc instance id {}", serviceInstanceId, e);
+            throw new RestApplicationException("data-conversion",
+                    "Request could not be completed due to internal error", e,
+                    HttpStatus.INTERNAL_SERVER_ERROR.value());
+        }
+
+        configServicesRepository.save(service);
+
+        return new ResponseEntity<>(HttpStatus.NO_CONTENT);
+    }
+
+    /**
+     * Get network instance group network data from the Config table specified
+     * Service Instance.
+     * <p>
+     * Maps to
+     * /config/GENERIC-RESOURCE-API:services/service/{service-instance-id}/service-data/network-instance-group/network-instance-group/{network-instance-group-id}/networks/network/{network-id}/
+     * 
+     * @param serviceInstanceId      the Service Instance ID to get
+     * @param networkInstanceGroupId the network instance group ID to get
+     * @param networkId              the network ID to get
+     * @return HttpStatus.OK (200) on successful GET
+     *         <p>
+     *         HttpStatus.INTERNAL_SERVER_ERROR (500) if unmarshalling Service Data
+     *         from the database fails
+     *         <p>
+     *         HttpStatus.NOT_FOUND (404) if {@code serviceInstanceId} does not
+     *         exist.
+     */
+    @Override
+    public ResponseEntity<GenericResourceApiNetworkinstancegroupNetworkinstancegroupNetworksNetwork> configGENERICRESOURCEAPIservicesServiceServiceInstanceIdServiceDataNetworkInstanceGroupsNetworkInstanceGroupNetworkInstanceGroupIdNetworksNetworkNetworkIdGet(
+            String serviceInstanceId, String networkInstanceGroupId, String networkId) throws RestException {
+        List<ConfigServices> services = configServicesRepository.findBySvcInstanceId(serviceInstanceId);
+
+        if ((services == null) || (services.isEmpty())) {
+            throw new RestProtocolException("data-missing", "No service entry found", HttpStatus.NOT_FOUND.value());
+        }
+
+        ConfigServices service = services.get(0);
+
+        if (service.getSvcData() == null) {
+            throw new RestProtocolException("data-missing", "No service-data found", HttpStatus.NOT_FOUND.value());
+        }
+        GenericResourceApiServicedataServiceData svcData = null;
+        try {
+            svcData = objectMapper.readValue(service.getSvcData(), GenericResourceApiServicedataServiceData.class);
+        } catch (JsonProcessingException e) {
+            log.error("Could not deserialize service data for svc instance id {}", serviceInstanceId, e);
+            throw new RestApplicationException("data-conversion",
+                    "Request could not be completed due to internal error", e,
+                    HttpStatus.INTERNAL_SERVER_ERROR.value());
+        }
+        GenericResourceApiNetworkInstanceGroup curNetInstanceGroup = svcData.getNetworkInstanceGroups();
+
+        List<GenericResourceApiNetworkinstancegroupNetworkInstanceGroup> curList = curNetInstanceGroup
+                .getNetworkInstanceGroup();
+        if (curList != null) {
+            for (GenericResourceApiNetworkinstancegroupNetworkInstanceGroup curItem : curList) {
+                if (networkInstanceGroupId.equals(curItem.getNetworkInstanceGroupId())) {
+                    GenericResourceApiNetworkinstancegroupNetworkinstancegroupNetworks curNetworks = curItem
+                            .getNetworks();
+                    List<GenericResourceApiNetworkinstancegroupNetworkinstancegroupNetworksNetwork> curNetList = curNetworks
+                            .getNetwork();
+                    for (GenericResourceApiNetworkinstancegroupNetworkinstancegroupNetworksNetwork curNetListItem : curNetList) {
+                        if (networkId.equals(curNetListItem.getNetworkId())) {
+                            return new ResponseEntity<>(curNetListItem, HttpStatus.OK);
+                        }
+                    }
+                }
+            }
+
+        }
+
+        return new ResponseEntity<>(null, HttpStatus.OK);
+    }
+
+    /**
+     * Post network to network instance group network data from the Config table
+     * specified Service Instance.
+     * <p>
+     * Maps to
+     * /config/GENERIC-RESOURCE-API:services/service/{service-instance-id}/service-data/network-instance-group/network-instance-group/{network-instance-group-id}/networks/network/{network-id}/
+     * 
+     * @param serviceInstanceId      the Service Instance ID to update
+     * @param networkInstanceGroupId the network instance group ID to update
+     * @param networkId              the network ID to update
+     * @param network                the network to add
+     * @return HttpStatus.OK (200) on successful GET
+     *         <p>
+     *         HttpStatus.INTERNAL_SERVER_ERROR (500) if unmarshalling Service Data
+     *         from the database fails
+     *         <p>
+     *         HttpStatus.NOT_FOUND (404) if {@code serviceInstanceId} does not
+     *         exist.
+     */
+    @Override
+    public ResponseEntity<Void> configGENERICRESOURCEAPIservicesServiceServiceInstanceIdServiceDataNetworkInstanceGroupsNetworkInstanceGroupNetworkInstanceGroupIdNetworksNetworkNetworkIdPost(
+            String serviceInstanceId, String networkInstanceGroupId, String networkId,
+            @Valid GenericResourceApiNetworkinstancegroupNetworkinstancegroupNetworksNetwork network)
+            throws RestException {
+        List<ConfigServices> services = configServicesRepository.findBySvcInstanceId(serviceInstanceId);
+
+        if ((services == null) || (services.isEmpty())) {
+            throw new RestProtocolException("data-missing", "No service entry found", HttpStatus.NOT_FOUND.value());
+        }
+
+        ConfigServices service = services.get(0);
+
+        if (service.getSvcData() == null) {
+            throw new RestProtocolException("data-missing", "No service-data found", HttpStatus.NOT_FOUND.value());
+        }
+        GenericResourceApiServicedataServiceData svcData = null;
+        try {
+            svcData = objectMapper.readValue(service.getSvcData(), GenericResourceApiServicedataServiceData.class);
+        } catch (JsonProcessingException e) {
+            log.error("Could not deserialize service data for svc instance id {}", serviceInstanceId, e);
+            throw new RestApplicationException("data-conversion",
+                    "Request could not be completed due to internal error", e,
+                    HttpStatus.INTERNAL_SERVER_ERROR.value());
+        }
+        GenericResourceApiNetworkInstanceGroup curNetInstanceGroup = svcData.getNetworkInstanceGroups();
+
+        List<GenericResourceApiNetworkinstancegroupNetworkInstanceGroup> curList = curNetInstanceGroup
+                .getNetworkInstanceGroup();
+        if (curList != null) {
+            for (GenericResourceApiNetworkinstancegroupNetworkInstanceGroup curItem : curList) {
+                if (networkInstanceGroupId.equals(curItem.getNetworkInstanceGroupId())) {
+                    GenericResourceApiNetworkinstancegroupNetworkinstancegroupNetworks curNetworks = curItem
+                            .getNetworks();
+                    GenericResourceApiNetworkinstancegroupNetworkinstancegroupNetworks newNetworks = new GenericResourceApiNetworkinstancegroupNetworkinstancegroupNetworks();
+                    List<GenericResourceApiNetworkinstancegroupNetworkinstancegroupNetworksNetwork> curNetList = curNetworks
+                            .getNetwork();
+                    for (GenericResourceApiNetworkinstancegroupNetworkinstancegroupNetworksNetwork curNetListItem : curNetList) {
+                        if (!networkId.equals(curNetListItem.getNetworkId())) {
+                            newNetworks.addNetworkItem(curNetListItem);
+                        } else {
+                            log.error(
+                                    "network already exists for svcInstanceId, networkInstanceGroupId, networkId {}, {}, {}",
+                                    serviceInstanceId, networkInstanceGroupId, networkId);
+                            throw new RestProtocolException("data-exists", "Data already exists for "
+                                    + serviceInstanceId + "/" + networkInstanceGroupId + "/" + networkId,
+                                    HttpStatus.CONFLICT.value());
+                        }
+                    }
+                    newNetworks.addNetworkItem(network);
+                    curItem.setNetworks(newNetworks);
+                }
+            }
+        }
+
+        try {
+            service.setSvcData(objectMapper.writeValueAsString(svcData));
+        } catch (JsonProcessingException e) {
+
+            log.error("Could not serialize service data for svc instance id {}", serviceInstanceId, e);
+            throw new RestApplicationException("data-conversion",
+                    "Request could not be completed due to internal error", e,
+                    HttpStatus.INTERNAL_SERVER_ERROR.value());
+        }
+
+        configServicesRepository.save(service);
+
+        return new ResponseEntity<>(HttpStatus.CREATED);
+    }
+
+    /**
+     * Put network to network instance group network data from the Config table
+     * specified Service Instance.
+     * <p>
+     * Maps to
+     * /config/GENERIC-RESOURCE-API:services/service/{service-instance-id}/service-data/network-instance-group/network-instance-group/{network-instance-group-id}/networks/network/{network-id}/
+     * 
+     * @param serviceInstanceId      the Service Instance ID to update
+     * @param networkInstanceGroupId the network instance group ID to update
+     * @param networkId              the network ID to update
+     * @param network                the network to add
+     * @return HttpStatus.OK (200) on successful GET
+     *         <p>
+     *         HttpStatus.INTERNAL_SERVER_ERROR (500) if unmarshalling Service Data
+     *         from the database fails
+     *         <p>
+     *         HttpStatus.NOT_FOUND (404) if {@code serviceInstanceId} does not
+     *         exist.
+     */
+    @Override
+    public ResponseEntity<Void> configGENERICRESOURCEAPIservicesServiceServiceInstanceIdServiceDataNetworkInstanceGroupsNetworkInstanceGroupNetworkInstanceGroupIdNetworksNetworkNetworkIdPut(
+            String serviceInstanceId, String networkInstanceGroupId, String networkId,
+            @Valid GenericResourceApiNetworkinstancegroupNetworkinstancegroupNetworksNetwork network)
+            throws RestException {
+        List<ConfigServices> services = configServicesRepository.findBySvcInstanceId(serviceInstanceId);
+        boolean networkExists = false;
+
+        if ((services == null) || (services.isEmpty())) {
+            throw new RestProtocolException("data-missing", "No service entry found", HttpStatus.NOT_FOUND.value());
+        }
+
+        ConfigServices service = services.get(0);
+
+        if (service.getSvcData() == null) {
+            throw new RestProtocolException("data-missing", "No service-data found", HttpStatus.NOT_FOUND.value());
+        }
+        GenericResourceApiServicedataServiceData svcData = null;
+        try {
+            svcData = objectMapper.readValue(service.getSvcData(), GenericResourceApiServicedataServiceData.class);
+        } catch (JsonProcessingException e) {
+            log.error("Could not deserialize service data for svc instance id {}", serviceInstanceId, e);
+            throw new RestApplicationException("data-conversion",
+                    "Request could not be completed due to internal error", e,
+                    HttpStatus.INTERNAL_SERVER_ERROR.value());
+        }
+        GenericResourceApiNetworkInstanceGroup curNetInstanceGroup = svcData.getNetworkInstanceGroups();
+
+        List<GenericResourceApiNetworkinstancegroupNetworkInstanceGroup> curList = curNetInstanceGroup
+                .getNetworkInstanceGroup();
+        if (curList != null) {
+            for (GenericResourceApiNetworkinstancegroupNetworkInstanceGroup curItem : curList) {
+                if (networkInstanceGroupId.equals(curItem.getNetworkInstanceGroupId())) {
+                    GenericResourceApiNetworkinstancegroupNetworkinstancegroupNetworks curNetworks = curItem
+                            .getNetworks();
+                    GenericResourceApiNetworkinstancegroupNetworkinstancegroupNetworks newNetworks = new GenericResourceApiNetworkinstancegroupNetworkinstancegroupNetworks();
+                    List<GenericResourceApiNetworkinstancegroupNetworkinstancegroupNetworksNetwork> curNetList = curNetworks
+                            .getNetwork();
+                    for (GenericResourceApiNetworkinstancegroupNetworkinstancegroupNetworksNetwork curNetListItem : curNetList) {
+                        if (!networkId.equals(curNetListItem.getNetworkId())) {
+                            newNetworks.addNetworkItem(curNetListItem);
+                        } else {
+                            networkExists = true;
+                            newNetworks.addNetworkItem(network);
+                        }
+                    }
+                    if (!networkExists) {
+                        newNetworks.addNetworkItem(network);
+                    }
+                    curItem.setNetworks(newNetworks);
+                }
+            }
+        }
+
+        try {
+            service.setSvcData(objectMapper.writeValueAsString(svcData));
+        } catch (JsonProcessingException e) {
+
+            log.error("Could not serialize service data for svc instance id {}", serviceInstanceId, e);
+            throw new RestApplicationException("data-conversion",
+                    "Request could not be completed due to internal error", e,
+                    HttpStatus.INTERNAL_SERVER_ERROR.value());
+        }
+
+        configServicesRepository.save(service);
+
+        if (networkExists) {
+            return new ResponseEntity<>(HttpStatus.NO_CONTENT);
+        } else {
+            return new ResponseEntity<>(HttpStatus.CREATED);
+        }
+    }
+
+    /**
+     * Delete vpn binding from network instance group network data from the Config
+     * table specified Service Instance.
+     * <p>
+     * Maps to
+     * /config/GENERIC-RESOURCE-API:services/service/{service-instance-id}/service-data/network-instance-group/network-instance-group/{network-instance-group-id}/networks/network/{network-id}/vpn-bindings/vpn-binding/{vpn-binding-id}/
+     * 
+     * @param serviceInstanceId      the Service Instance ID to delete from
+     * @param networkInstanceGroupId the network instance group ID to delete
+     * @param networkId              the network ID to delete
+     * @param vpnBindingId           the vpn binding ID to delete
+     * @return HttpStatus.OK (200) on successful DELETE
+     *         <p>
+     *         HttpStatus.INTERNAL_SERVER_ERROR (500) if unmarshalling Service Data
+     *         from the database fails
+     *         <p>
+     *         HttpStatus.NOT_FOUND (404) if {@code serviceInstanceId} does not
+     *         exist.
+     */
+    @Override
+    public ResponseEntity<Void> configGENERICRESOURCEAPIservicesServiceServiceInstanceIdServiceDataNetworkInstanceGroupsNetworkInstanceGroupNetworkInstanceGroupIdNetworksNetworkNetworkIdVpnBindingsVpnBindingIdDelete(
+            String serviceInstanceId, String networkInstanceGroupId, String networkId, String vpnBindingId)
+            throws RestException {
+        List<ConfigServices> services = configServicesRepository.findBySvcInstanceId(serviceInstanceId);
+
+        if ((services == null) || (services.isEmpty())) {
+            throw new RestProtocolException("data-missing", "No service entry found", HttpStatus.NOT_FOUND.value());
+        }
+
+        ConfigServices service = services.get(0);
+
+        if (service.getSvcData() == null) {
+            throw new RestProtocolException("data-missing", "No service-data found", HttpStatus.NOT_FOUND.value());
+        }
+        GenericResourceApiServicedataServiceData svcData = null;
+        try {
+            svcData = objectMapper.readValue(service.getSvcData(), GenericResourceApiServicedataServiceData.class);
+        } catch (JsonProcessingException e) {
+            log.error("Could not deserialize service data for svc instance id {}", serviceInstanceId, e);
+            throw new RestApplicationException("data-conversion",
+                    "Request could not be completed due to internal error", e,
+                    HttpStatus.INTERNAL_SERVER_ERROR.value());
+        }
+        GenericResourceApiNetworkInstanceGroup curNetInstanceGroup = svcData.getNetworkInstanceGroups();
+
+        List<GenericResourceApiNetworkinstancegroupNetworkInstanceGroup> curList = curNetInstanceGroup
+                .getNetworkInstanceGroup();
+        if (curList != null) {
+            for (GenericResourceApiNetworkinstancegroupNetworkInstanceGroup curItem : curList) {
+                if (networkInstanceGroupId.equals(curItem.getNetworkInstanceGroupId())) {
+                    GenericResourceApiNetworkinstancegroupNetworkinstancegroupNetworks curNetworks = curItem
+                            .getNetworks();
+                    List<GenericResourceApiNetworkinstancegroupNetworkinstancegroupNetworksNetwork> curNetList = curNetworks
+                            .getNetwork();
+                    for (GenericResourceApiNetworkinstancegroupNetworkinstancegroupNetworksNetwork curNetListItem : curNetList) {
+                        if (networkId.equals(curNetListItem.getNetworkId())) {
+                            List<GenericResourceApiVpnbindingsVpnBindings> curVpnBindings = curNetListItem
+                                    .getVpnBindings();
+                            ArrayList<GenericResourceApiVpnbindingsVpnBindings> newVpnBindings = new ArrayList<>(
+                                    curVpnBindings.size() - 1);
+                            for (GenericResourceApiVpnbindingsVpnBindings curBinding : curVpnBindings) {
+                                if (!vpnBindingId.equals(curBinding.getVpnBindingId())) {
+                                    newVpnBindings.add(curBinding);
+                                }
+                            }
+                            curNetListItem.setVpnBindings(newVpnBindings);
+                        }
+                    }
+                }
+            }
+
+        }
+        try {
+            service.setSvcData(objectMapper.writeValueAsString(svcData));
+        } catch (JsonProcessingException e) {
+
+            log.error("Could not serialize service data for svc instance id {}", serviceInstanceId, e);
+            throw new RestApplicationException("data-conversion",
+                    "Request could not be completed due to internal error", e,
+                    HttpStatus.INTERNAL_SERVER_ERROR.value());
+        }
+
+        configServicesRepository.save(service);
+
+        return new ResponseEntity<>(HttpStatus.NO_CONTENT);
+    }
+
+    /**
+     * Get vpn binding from network instance group network data from the Config
+     * table specified Service Instance.
+     * <p>
+     * Maps to
+     * /config/GENERIC-RESOURCE-API:services/service/{service-instance-id}/service-data/network-instance-group/network-instance-group/{network-instance-group-id}/networks/network/{network-id}/vpn-bindings/vpn-binding/{vpn-binding-id}/
+     * 
+     * @param serviceInstanceId      the Service Instance ID to get
+     * @param networkInstanceGroupId the network instance group ID to get
+     * @param networkId              the network ID to get
+     * @param vpnBindingId           the vpn binding ID to get
+     * @return HttpStatus.OK (200) on successful GET
+     *         <p>
+     *         HttpStatus.INTERNAL_SERVER_ERROR (500) if unmarshalling Service Data
+     *         from the database fails
+     *         <p>
+     *         HttpStatus.NOT_FOUND (404) if {@code serviceInstanceId} does not
+     *         exist.
+     */
+    @Override
+    public ResponseEntity<GenericResourceApiVpnbindingsVpnBindings> configGENERICRESOURCEAPIservicesServiceServiceInstanceIdServiceDataNetworkInstanceGroupsNetworkInstanceGroupNetworkInstanceGroupIdNetworksNetworkNetworkIdVpnBindingsVpnBindingIdGet(
+            String serviceInstanceId, String networkInstanceGroupId, String networkId, String vpnBindingId)
+            throws RestException {
+        List<ConfigServices> services = configServicesRepository.findBySvcInstanceId(serviceInstanceId);
+
+        if ((services == null) || (services.isEmpty())) {
+            throw new RestProtocolException("data-missing", "No service entry found", HttpStatus.NOT_FOUND.value());
+        }
+
+        ConfigServices service = services.get(0);
+
+        if (service.getSvcData() == null) {
+            throw new RestProtocolException("data-missing", "No service-data found", HttpStatus.NOT_FOUND.value());
+        }
+        GenericResourceApiServicedataServiceData svcData = null;
+        try {
+            svcData = objectMapper.readValue(service.getSvcData(), GenericResourceApiServicedataServiceData.class);
+        } catch (JsonProcessingException e) {
+            log.error("Could not deserialize service data for svc instance id {}", serviceInstanceId, e);
+            throw new RestApplicationException("data-conversion",
+                    "Request could not be completed due to internal error", e,
+                    HttpStatus.INTERNAL_SERVER_ERROR.value());
+        }
+        GenericResourceApiNetworkInstanceGroup curNetInstanceGroup = svcData.getNetworkInstanceGroups();
+
+        List<GenericResourceApiNetworkinstancegroupNetworkInstanceGroup> curList = curNetInstanceGroup
+                .getNetworkInstanceGroup();
+        if (curList != null) {
+            for (GenericResourceApiNetworkinstancegroupNetworkInstanceGroup curItem : curList) {
+                if (networkInstanceGroupId.equals(curItem.getNetworkInstanceGroupId())) {
+                    GenericResourceApiNetworkinstancegroupNetworkinstancegroupNetworks curNetworks = curItem
+                            .getNetworks();
+                    List<GenericResourceApiNetworkinstancegroupNetworkinstancegroupNetworksNetwork> curNetList = curNetworks
+                            .getNetwork();
+                    for (GenericResourceApiNetworkinstancegroupNetworkinstancegroupNetworksNetwork curNetListItem : curNetList) {
+                        if (networkId.equals(curNetListItem.getNetworkId())) {
+                            List<GenericResourceApiVpnbindingsVpnBindings> curVpnBindings = curNetListItem
+                                    .getVpnBindings();
+                            for (GenericResourceApiVpnbindingsVpnBindings curBinding : curVpnBindings) {
+                                if (vpnBindingId.equals(curBinding.getVpnBindingId())) {
+                                    return new ResponseEntity<>(curBinding, HttpStatus.OK);
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        return new ResponseEntity<>(null, HttpStatus.OK);
+    }
+
+    /**
+     * Post vpn binding from network instance group network data from the Config
+     * table specified Service Instance.
+     * <p>
+     * Maps to
+     * /config/GENERIC-RESOURCE-API:services/service/{service-instance-id}/service-data/network-instance-group/network-instance-group/{network-instance-group-id}/networks/network/{network-id}/vpn-bindings/vpn-binding/{vpn-binding-id}/
+     * 
+     * @param serviceInstanceId      the Service Instance ID to update
+     * @param networkInstanceGroupId the network instance group ID to update
+     * @param networkId              the network ID to update
+     * @param vpnBindingId           the vpn binding ID to post
+     * @param vpnBinding             the vpn binding body to post
+     * @return HttpStatus.CREATED (201) on successful POST
+     *         <p>
+     *         HttpStatus.INTERNAL_SERVER_ERROR (500) if unmarshalling Service Data
+     *         from the database fails
+     *         <p>
+     *         HttpStatus.NOT_FOUND (404) if {@code serviceInstanceId} does not
+     *         exist.
+     */
+    @Override
+    public ResponseEntity<Void> configGENERICRESOURCEAPIservicesServiceServiceInstanceIdServiceDataNetworkInstanceGroupsNetworkInstanceGroupNetworkInstanceGroupIdNetworksNetworkNetworkIdVpnBindingsVpnBindingIdPost(
+            String serviceInstanceId, String networkInstanceGroupId, String networkId, String vpnBindingId,
+            @Valid GenericResourceApiVpnbindingsVpnBindings vpnBinding) throws RestException {
+        List<ConfigServices> services = configServicesRepository.findBySvcInstanceId(serviceInstanceId);
+
+        if ((services == null) || (services.isEmpty())) {
+            throw new RestProtocolException("data-missing", "No service entry found", HttpStatus.NOT_FOUND.value());
+        }
+
+        ConfigServices service = services.get(0);
+
+        if (service.getSvcData() == null) {
+            throw new RestProtocolException("data-missing", "No service-data found", HttpStatus.NOT_FOUND.value());
+        }
+        GenericResourceApiServicedataServiceData svcData = null;
+        try {
+            svcData = objectMapper.readValue(service.getSvcData(), GenericResourceApiServicedataServiceData.class);
+        } catch (JsonProcessingException e) {
+            log.error("Could not deserialize service data for svc instance id {}", serviceInstanceId, e);
+            throw new RestApplicationException("data-conversion",
+                    "Request could not be completed due to internal error", e,
+                    HttpStatus.INTERNAL_SERVER_ERROR.value());
+        }
+        GenericResourceApiNetworkInstanceGroup curNetInstanceGroup = svcData.getNetworkInstanceGroups();
+
+        List<GenericResourceApiNetworkinstancegroupNetworkInstanceGroup> curList = curNetInstanceGroup
+                .getNetworkInstanceGroup();
+        if (curList != null) {
+            for (GenericResourceApiNetworkinstancegroupNetworkInstanceGroup curItem : curList) {
+                if (networkInstanceGroupId.equals(curItem.getNetworkInstanceGroupId())) {
+                    GenericResourceApiNetworkinstancegroupNetworkinstancegroupNetworks curNetworks = curItem
+                            .getNetworks();
+                    List<GenericResourceApiNetworkinstancegroupNetworkinstancegroupNetworksNetwork> curNetList = curNetworks
+                            .getNetwork();
+                    for (GenericResourceApiNetworkinstancegroupNetworkinstancegroupNetworksNetwork curNetListItem : curNetList) {
+                        if (networkId.equals(curNetListItem.getNetworkId())) {
+                            List<GenericResourceApiVpnbindingsVpnBindings> curVpnBindings = curNetListItem
+                                    .getVpnBindings();
+                            ArrayList<GenericResourceApiVpnbindingsVpnBindings> newVpnBindings = new ArrayList<>(
+                                    curVpnBindings.size() - 1);
+                            for (GenericResourceApiVpnbindingsVpnBindings curBinding : curVpnBindings) {
+                                if (!vpnBindingId.equals(curBinding.getVpnBindingId())) {
+                                    newVpnBindings.add(curBinding);
+                                } else {
+                                    log.error(
+                                            "vpn-binding already exists for svcInstanceId, networkInstanceGroupId, networkId, vpnBindingId {}, {}, {}, {}",
+                                            serviceInstanceId, networkInstanceGroupId, networkId, vpnBindingId);
+                                    throw new RestProtocolException("data-exists",
+                                            "Data already exists for " + serviceInstanceId + "/"
+                                                    + networkInstanceGroupId + "/" + networkId + "/" + vpnBindingId,
+                                            HttpStatus.CONFLICT.value());
+                                }
+                            }
+                            newVpnBindings.add(vpnBinding);
+                            curNetListItem.setVpnBindings(newVpnBindings);
+                        }
+                    }
+                }
+            }
+
+        }
+        try {
+            service.setSvcData(objectMapper.writeValueAsString(svcData));
+        } catch (JsonProcessingException e) {
+
+            log.error("Could not serialize service data for svc instance id {}", serviceInstanceId, e);
+            throw new RestApplicationException("data-conversion",
+                    "Request could not be completed due to internal error", e,
+                    HttpStatus.INTERNAL_SERVER_ERROR.value());
+        }
+
+        configServicesRepository.save(service);
+
+        return new ResponseEntity<>(HttpStatus.CREATED);
+    }
+
+    /**
+     * Put vpn binding from network instance group network data from the Config
+     * table specified Service Instance.
+     * <p>
+     * Maps to
+     * /config/GENERIC-RESOURCE-API:services/service/{service-instance-id}/service-data/network-instance-group/network-instance-group/{network-instance-group-id}/networks/network/{network-id}/vpn-bindings/vpn-binding/{vpn-binding-id}/
+     * 
+     * @param serviceInstanceId      the Service Instance ID to update
+     * @param networkInstanceGroupId the network instance group ID to update
+     * @param networkId              the network ID to update
+     * @param vpnBindingId           the vpn binding ID to post
+     * @param vpnBinding             the vpn binding body to post
+     * @return HttpStatus.CREATED (201) on successful POST
+     *         <p>
+     *         HttpStatus.INTERNAL_SERVER_ERROR (500) if unmarshalling Service Data
+     *         from the database fails
+     *         <p>
+     *         HttpStatus.NOT_FOUND (404) if {@code serviceInstanceId} does not
+     *         exist.
+     */
+    @Override
+    public ResponseEntity<Void> configGENERICRESOURCEAPIservicesServiceServiceInstanceIdServiceDataNetworkInstanceGroupsNetworkInstanceGroupNetworkInstanceGroupIdNetworksNetworkNetworkIdVpnBindingsVpnBindingIdPut(
+            String serviceInstanceId, String networkInstanceGroupId, String networkId, String vpnBindingId,
+            @Valid GenericResourceApiVpnbindingsVpnBindings vpnBinding) throws RestException {
+        List<ConfigServices> services = configServicesRepository.findBySvcInstanceId(serviceInstanceId);
+        boolean vpnBindingExists = false;
+        if ((services == null) || (services.isEmpty())) {
+            throw new RestProtocolException("data-missing", "No service entry found", HttpStatus.NOT_FOUND.value());
+        }
+
+        ConfigServices service = services.get(0);
+
+        if (service.getSvcData() == null) {
+            throw new RestProtocolException("data-missing", "No service-data found", HttpStatus.NOT_FOUND.value());
+        }
+        GenericResourceApiServicedataServiceData svcData = null;
+        try {
+            svcData = objectMapper.readValue(service.getSvcData(), GenericResourceApiServicedataServiceData.class);
+        } catch (JsonProcessingException e) {
+            log.error("Could not deserialize service data for svc instance id {}", serviceInstanceId, e);
+            throw new RestApplicationException("data-conversion",
+                    "Request could not be completed due to internal error", e,
+                    HttpStatus.INTERNAL_SERVER_ERROR.value());
+        }
+        GenericResourceApiNetworkInstanceGroup curNetInstanceGroup = svcData.getNetworkInstanceGroups();
+
+        List<GenericResourceApiNetworkinstancegroupNetworkInstanceGroup> curList = curNetInstanceGroup
+                .getNetworkInstanceGroup();
+        if (curList != null) {
+            for (GenericResourceApiNetworkinstancegroupNetworkInstanceGroup curItem : curList) {
+                if (networkInstanceGroupId.equals(curItem.getNetworkInstanceGroupId())) {
+                    GenericResourceApiNetworkinstancegroupNetworkinstancegroupNetworks curNetworks = curItem
+                            .getNetworks();
+                    List<GenericResourceApiNetworkinstancegroupNetworkinstancegroupNetworksNetwork> curNetList = curNetworks
+                            .getNetwork();
+                    for (GenericResourceApiNetworkinstancegroupNetworkinstancegroupNetworksNetwork curNetListItem : curNetList) {
+                        if (networkId.equals(curNetListItem.getNetworkId())) {
+                            List<GenericResourceApiVpnbindingsVpnBindings> curVpnBindings = curNetListItem
+                                    .getVpnBindings();
+                            ArrayList<GenericResourceApiVpnbindingsVpnBindings> newVpnBindings = new ArrayList<>(
+                                    curVpnBindings.size() - 1);
+                            for (GenericResourceApiVpnbindingsVpnBindings curBinding : curVpnBindings) {
+                                if (!vpnBindingId.equals(curBinding.getVpnBindingId())) {
+                                    newVpnBindings.add(curBinding);
+                                } else {
+                                    vpnBindingExists = true;
+                                    newVpnBindings.add(vpnBinding);
+                                }
+                            }
+                            if (!vpnBindingExists) {
+                                newVpnBindings.add(vpnBinding);
+                            }
+                            curNetListItem.setVpnBindings(newVpnBindings);
+                        }
+                    }
+                }
+            }
+
+        }
+        try {
+            service.setSvcData(objectMapper.writeValueAsString(svcData));
+        } catch (JsonProcessingException e) {
+
+            log.error("Could not serialize service data for svc instance id {}", serviceInstanceId, e);
+            throw new RestApplicationException("data-conversion",
+                    "Request could not be completed due to internal error", e,
+                    HttpStatus.INTERNAL_SERVER_ERROR.value());
+        }
+
+        configServicesRepository.save(service);
+
+        if (vpnBindingExists) {
+            return new ResponseEntity<>(HttpStatus.NO_CONTENT);
+        } else {
+            return new ResponseEntity<>(HttpStatus.CREATED);
+        }
+    }
+
+    /**
+     * Get network data from the Config table specified Service Instance.
+     * <p>
+     * Maps to
+     * /config/GENERIC-RESOURCE-API:services/service/{service-instance-id}/service-data/networks/
+     * 
+     * @param serviceInstanceId the Service Instance ID to perform the get on
+     * @return HttpStatus.OK (200) on successful GET
+     *         <p>
+     *         HttpStatus.INTERNAL_SERVER_ERROR (500) if unmarshalling Service Data
+     *         from the database fails
+     *         <p>
+     *         HttpStatus.NOT_FOUND (404) if {@code serviceInstanceId} does not
+     *         exist.
+     */
+
+    @Override
+    public ResponseEntity<GenericResourceApiServicedataServicedataNetworks> configGENERICRESOURCEAPIservicesServiceServiceInstanceIdServiceDataNetworksGet(
+            String serviceInstanceId) throws RestException {
+        log.info("GET | Network Data for svcInstanceId ({})", serviceInstanceId);
+
+        List<ConfigServices> services = configServicesRepository.findBySvcInstanceId(serviceInstanceId);
+        if ((services == null) || (services.isEmpty())) {
+            throw new RestProtocolException("data-missing", "No service entry found", HttpStatus.NOT_FOUND.value());
+        }
+
+        GenericResourceApiServicedataServicedataNetworks networks = null;
+        try {
+            networks = serviceDataHelper.getNetworks(serviceInstanceId);
+        } catch (JsonProcessingException e) {
+            log.error("Could not parse service data", e);
+            throw new RestApplicationException("data-conversion",
+                    "Request could not be completed due to internal error", e,
+                    HttpStatus.INTERNAL_SERVER_ERROR.value());
+        }
+
+        return new ResponseEntity<>(networks, HttpStatus.OK);
+    }
+
+    /**
+     * Delete network data from the Config table specified Service Instance and network
+     * id
+     * <p>
+     * Maps to
+     * /config/GENERIC-RESOURCE-API:services/service/{service-instance-id}/service-data/networks/network/{network-id}/
+     * 
+     * @param serviceInstanceId the Service Instance ID to perform the get on
+     * @param networkId         the network ID to perform the delete on
+     * @return HttpStatus.NO_CONTENT (204) on successful DELETE
+     *         <p>
+     *         HttpStatus.INTERNAL_SERVER_ERROR (500) if unmarshalling Service Data
+     *         from the database fails
+     *         <p>
+     *         HttpStatus.NOT_FOUND (404) if {@code serviceInstanceId}
+     *         does not exist.
+     */
+
+    @Override
+    public ResponseEntity<Void> configGENERICRESOURCEAPIservicesServiceServiceInstanceIdServiceDataNetworksNetworkNetworkIdDelete(
+        String serviceInstanceId, String networkId) throws RestException {
+        log.info("DELETE | Network Data for ({}, {})", serviceInstanceId, networkId);
+
+        List<ConfigServices> services = configServicesRepository.findBySvcInstanceId(serviceInstanceId);
+        ConfigServices data;
+        if ((services == null) || (services.isEmpty())) {
+            log.info("Could not find data for ({}).", serviceInstanceId);
+            // Or throw the data not found error?
+            throw new RestProtocolException("data-missing", "Service Instance ID not found.",
+                        HttpStatus.NOT_FOUND.value());
+        } else {
+            data = services.get(0);
+        }
+
+        if (!serviceDataHelper.hasServiceData(data)) {
+            log.info("Could not find Service Data for ({}).", serviceInstanceId);
+            throw new RestProtocolException("data-missing", "Service data not found.", HttpStatus.NOT_FOUND.value());
+        }
+        GenericResourceApiServicedataServicedataNetworksNetwork network = null;
+        try {
+            network = serviceDataHelper.getNetwork(serviceInstanceId, networkId);
+        } catch (JsonProcessingException e) {
+            log.error("Could not parse service data", e);
+            throw new RestApplicationException("data-conversion",
+                    "Request could not be completed due to internal error", e,
+                    HttpStatus.INTERNAL_SERVER_ERROR.value());
+        }
+
+        if (network != null) {
+            serviceDataHelper.deleteNetwork(serviceInstanceId, networkId);
+        }
+
+        return new ResponseEntity<>(HttpStatus.NO_CONTENT);
+
+    }
+
+    /**
+     * Get network data from the Config table specified Service Instance and network
+     * id
+     * <p>
+     * Maps to
+     * /config/GENERIC-RESOURCE-API:services/service/{service-instance-id}/service-data/networks/network/{network-id}/
+     * 
+     * @param serviceInstanceId the Service Instance ID to perform the get on
+     * @param networkId         the network ID to perform the get on
+     * @return HttpStatus.OK (200) on successful GET
+     *         <p>
+     *         HttpStatus.INTERNAL_SERVER_ERROR (500) if unmarshalling Service Data
+     *         from the database fails
+     *         <p>
+     *         HttpStatus.NOT_FOUND (404) if {@code serviceInstanceId, networkId}
+     *         does not exist.
+     */
+
+    @Override
+    public ResponseEntity<GenericResourceApiServicedataServicedataNetworksNetwork> configGENERICRESOURCEAPIservicesServiceServiceInstanceIdServiceDataNetworksNetworkNetworkIdGet(
+            String serviceInstanceId, String networkId) throws RestException {
+        log.info("GET | Network Data for serviceInstanceId, networkId ({})", serviceInstanceId, networkId);
+
+        List<ConfigServices> services = configServicesRepository.findBySvcInstanceId(serviceInstanceId);
+        if ((services == null) || (services.isEmpty())) {
+            throw new RestProtocolException("data-missing", "No service entry found", HttpStatus.NOT_FOUND.value());
+        }
+
+        GenericResourceApiServicedataServicedataNetworksNetwork network = null;
+        try {
+            network = serviceDataHelper.getNetwork(serviceInstanceId, networkId);
+        } catch (JsonProcessingException e) {
+            log.error("Could not parse service data", e);
+            throw new RestApplicationException("data-conversion",
+                    "Request could not be completed due to internal error", e,
+                    HttpStatus.INTERNAL_SERVER_ERROR.value());
+        }
+
+        if (network == null) {
+            log.info("No information found for {}", networkId);
+            throw new RestApplicationException("data-missing",
+                    "Request could not be completed because the relevant data model content does not exist",
+                    HttpStatus.NOT_FOUND.value());
+        }
+
+        return new ResponseEntity<>(network, HttpStatus.OK);
+    }
+     /**
+     * Post network data to the Config table specified Service Instance and network
+     * id
+     * <p>
+     * Maps to
+     * /config/GENERIC-RESOURCE-API:services/service/{service-instance-id}/service-data/networks/network/{network-id}/
+     * 
+     * @param serviceInstanceId the Service Instance ID to perform the get on
+     * @param networkId         the network ID to perform the get on
+     * @return HttpStatus.CREATED (201) on successful POST if new network
+     *         <p>
+     *         HttpStatus.CONFLICT (409) if network already existed
+     *         <p>
+     *         HttpStatus.INTERNAL_SERVER_ERROR (500) if unmarshalling Service Data
+     *         from the database fails
+     *         <p>
+     *         HttpStatus.NOT_FOUND (404) if {@code serviceInstanceId, networkId}
+     *         does not exist.
+     */
+    @Override
+    public ResponseEntity<Void> configGENERICRESOURCEAPIservicesServiceServiceInstanceIdServiceDataNetworksNetworkNetworkIdPost(
+            String serviceInstanceId, String networkId,
+            @Valid GenericResourceApiServicedataServicedataNetworksNetwork network)
+            throws RestException {
+        log.info("POST | Network Data for ({}, {})", serviceInstanceId, networkId);
+
+        List<ConfigServices> services = configServicesRepository.findBySvcInstanceId(serviceInstanceId);
+        ConfigServices data;
+        ServiceDataTransaction transaction = serviceDataHelper.createTransaction();
+
+        if ((services == null) || (services.isEmpty())) {
+            log.info("Could not find data for ({}).", serviceInstanceId);
+            // Or throw the data not found error?
+            throw new RestProtocolException("data-missing", "Service Instance ID not found.",
+                    HttpStatus.NOT_FOUND.value());
+        } else {
+            data = services.get(0);
+        }
+
+        if (!serviceDataHelper.hasServiceData(data)) {
+            log.info("Could not find Service Data for ({}).", serviceInstanceId);
+            throw new RestProtocolException("data-missing", "Service data not found.", HttpStatus.NOT_FOUND.value());
+        }
+
+        if (serviceDataHelper.networkExists(serviceInstanceId, networkId)) {
+
+            log.error("network already exists for svcInstanceId, networkId {}, {}", serviceInstanceId, networkId);
+            throw new RestProtocolException("data-exists", "Data already exists for " + serviceInstanceId+","+networkId,
+                    HttpStatus.CONFLICT.value());
+        }
+
+        try {
+            serviceDataHelper.saveNetwork(serviceInstanceId, network, null);
+        } catch (JsonProcessingException e) {
+            log.error("Could not parse service data", e);
+            throw new RestApplicationException("data-conversion",
+                    "Request could not be completed due to internal error", e,
+                    HttpStatus.INTERNAL_SERVER_ERROR.value());
+        }
+
+
+        return new ResponseEntity<>(HttpStatus.CREATED);
+    }
+
+    /**
+     * Put network data to the Config table specified Service Instance and network
+     * id
+     * <p>
+     * Maps to
+     * /config/GENERIC-RESOURCE-API:services/service/{service-instance-id}/service-data/networks/network/{network-id}/
+     * 
+     * @param serviceInstanceId the Service Instance ID to perform the get on
+     * @param networkId         the network ID to perform the get on
+     * @return HttpStatus.CREATED (201) on successful PUT if new network
+     *         <p>
+     *         HttpStatus.NO_CONTENT(204) on successful PUT if network already existed
+     *         <p>
+     *         HttpStatus.INTERNAL_SERVER_ERROR (500) if unmarshalling Service Data
+     *         from the database fails
+     *         <p>
+     *         HttpStatus.NOT_FOUND (404) if {@code serviceInstanceId, networkId}
+     *         does not exist.
+     */
+    @Override
+    public ResponseEntity<Void> configGENERICRESOURCEAPIservicesServiceServiceInstanceIdServiceDataNetworksNetworkNetworkIdPut(
+            String serviceInstanceId, String networkId,
+            @Valid GenericResourceApiServicedataServicedataNetworksNetwork network) throws RestException {
+        log.info("PUT | Network Data for ({}, {})", serviceInstanceId, networkId);
+
+        List<ConfigServices> services = configServicesRepository.findBySvcInstanceId(serviceInstanceId);
+        ConfigServices data;
+        ServiceDataTransaction transaction = serviceDataHelper.createTransaction();
+
+        if ((services == null) || (services.isEmpty())) {
+            log.info("Could not find data for ({}).", serviceInstanceId);
+            // Or throw the data not found error?
+            throw new RestProtocolException("data-missing", "Service Instance ID not found.",
+                    HttpStatus.NOT_FOUND.value());
+        } else {
+            data = services.get(0);
+        }
+
+        if (!serviceDataHelper.hasServiceData(data)) {
+            log.info("Could not find Service Data for ({}).", serviceInstanceId);
+            throw new RestProtocolException("data-missing", "Service data not found.", HttpStatus.NOT_FOUND.value());
+        }
+
+        boolean networkAlreadyExisted = serviceDataHelper.networkExists(serviceInstanceId, networkId);
+
+        try {
+            serviceDataHelper.saveNetwork(serviceInstanceId, network, null);
+        } catch (JsonProcessingException e) {
+            log.error("Could not parse service data", e);
+            throw new RestApplicationException("data-conversion",
+                    "Request could not be completed due to internal error", e,
+                    HttpStatus.INTERNAL_SERVER_ERROR.value());
+        }
+
+        if (networkAlreadyExisted) {
+            return new ResponseEntity<>(HttpStatus.NO_CONTENT);
+        } else {
+            return new ResponseEntity<>(HttpStatus.CREATED);
+        }
+
+    }
+
+    /**
+     * Delete network oper status data from the Config table specified Service
+     * Instance and network id
+     * <p>
+     * Maps to
+     * /config/GENERIC-RESOURCE-API:services/service/{service-instance-id}/service-data/networks/network/{network-id}/network-data/network-level-oper-status/
+     * 
+     * @param serviceInstanceId the Service Instance ID to update
+     * @param networkId         the network ID to update
+     * @return HttpStatus.OK (200) on successful GET
+     *         <p>
+     *         HttpStatus.INTERNAL_SERVER_ERROR (500) if unmarshalling Service Data
+     *         from the database fails
+     *         <p>
+     *         HttpStatus.NOT_FOUND (404) if {@code serviceInstanceId, networkId}
+     *         does not exist.
+     */
+    @Override
+    public ResponseEntity<Void> configGENERICRESOURCEAPIservicesServiceServiceInstanceIdServiceDataNetworksNetworkNetworkIdNetworkDataNetworkLevelOperStatusDelete(
+            String serviceInstanceId, String networkId) throws RestException {
+        log.info("DELETE | Network level oper status Data for ({}, {})", serviceInstanceId, networkId);
+
+        List<ConfigServices> services = configServicesRepository.findBySvcInstanceId(serviceInstanceId);
+        ConfigServices data;
+        if ((services == null) || (services.isEmpty())) {
+            log.info("Could not find data for ({}).", serviceInstanceId);
+            // Or throw the data not found error?
+            throw new RestProtocolException("data-missing", "Service Instance ID not found.",
+                    HttpStatus.NOT_FOUND.value());
+        } else {
+            data = services.get(0);
+        }
+
+        if (!serviceDataHelper.hasServiceData(data)) {
+            log.info("Could not find Service Data for ({}).", serviceInstanceId);
+            throw new RestProtocolException("data-missing", "Service data not found.", HttpStatus.NOT_FOUND.value());
+        }
+        GenericResourceApiServicedataServicedataNetworksNetwork network = null;
+        try {
+            network = serviceDataHelper.getNetwork(serviceInstanceId, networkId);
+        } catch (JsonProcessingException e) {
+            log.error("Could not parse service data", e);
+            throw new RestApplicationException("data-conversion",
+                    "Request could not be completed due to internal error", e,
+                    HttpStatus.INTERNAL_SERVER_ERROR.value());
+        }
+
+        if (network == null) {
+            log.info("No information found for {}", networkId);
+            throw new RestApplicationException("data-missing",
+                    "Request could not be completed because the relevant data model content does not exist",
+                    HttpStatus.NOT_FOUND.value());
+        }
+
+        if (network.getNetworkData() != null) {
+            network.getNetworkData().setNetworkLevelOperStatus(null);
+            try {
+                serviceDataHelper.saveNetwork(serviceInstanceId, network, null);
+            } catch (JsonProcessingException e) {
+                log.error("Could not parse service data", e);
+                throw new RestApplicationException("data-conversion",
+                        "Request could not be completed due to internal error", e,
+                        HttpStatus.INTERNAL_SERVER_ERROR.value());
+            }
+        }
+        return new ResponseEntity<>(HttpStatus.NO_CONTENT);
+    }
+
+    /**
+     * Get network oper status data from the Config table specified Service Instance
+     * and network id
+     * <p>
+     * Maps to
+     * /config/GENERIC-RESOURCE-API:services/service/{service-instance-id}/service-data/networks/network/{network-id}/network-data/network-level-oper-status/
+     * 
+     * @param serviceInstanceId the Service Instance ID to perform the get on
+     * @param networkId         the network ID to perform the get on
+     * @return HttpStatus.OK (200) on successful GET
+     *         <p>
+     *         HttpStatus.INTERNAL_SERVER_ERROR (500) if unmarshalling Service Data
+     *         from the database fails
+     *         <p>
+     *         HttpStatus.NOT_FOUND (404) if {@code serviceInstanceId, networkId}
+     *         does not exist.
+     */
+    @Override
+    public ResponseEntity<GenericResourceApiOperStatusData> configGENERICRESOURCEAPIservicesServiceServiceInstanceIdServiceDataNetworksNetworkNetworkIdNetworkDataNetworkLevelOperStatusGet(
+            String serviceInstanceId, String networkId) throws RestException {
+        log.info("GET | Network level oper status Data for serviceInstanceId, networkId ({})", serviceInstanceId,
+                networkId);
+
+        List<ConfigServices> services = configServicesRepository.findBySvcInstanceId(serviceInstanceId);
+        if ((services == null) || (services.isEmpty())) {
+            throw new RestProtocolException("data-missing", "No service entry found", HttpStatus.NOT_FOUND.value());
+        }
+
+        GenericResourceApiServicedataServicedataNetworksNetwork network = null;
+        try {
+            network = serviceDataHelper.getNetwork(serviceInstanceId, networkId);
+        } catch (JsonProcessingException e) {
+            log.error("Could not parse service data", e);
+            throw new RestApplicationException("data-conversion",
+                    "Request could not be completed due to internal error", e,
+                    HttpStatus.INTERNAL_SERVER_ERROR.value());
+        }
+
+        if (network == null) {
+            log.info("No information found for {}", networkId);
+            throw new RestApplicationException("data-missing",
+                    "Request could not be completed because the relevant data model content does not exist",
+                    HttpStatus.NOT_FOUND.value());
+        }
+
+        GenericResourceApiServicedataServicedataNetworksNetworkNetworkData networkData = network.getNetworkData();
+        if (networkData == null) {
+            log.info("No network-data  found for {}", networkId);
+            throw new RestApplicationException("data-missing",
+                    "Request could not be completed because the relevant data model content does not exist",
+                    HttpStatus.NOT_FOUND.value());
+        }
+
+        return new ResponseEntity<>(networkData.getNetworkLevelOperStatus(), HttpStatus.OK);
+    }
+
+    /**
+     * Post network oper status data to the Config table specified Service Instance
+     * and network id
+     * <p>
+     * Maps to
+     * /config/GENERIC-RESOURCE-API:services/service/{service-instance-id}/service-data/networks/network/{network-id}/network-data/network-level-oper-status/
+     * 
+     * @param serviceInstanceId the Service Instance ID to post to
+     * @param networkId         the network ID to post to
+     * @param operStatus        the oper status to set
+     * @return HttpStatus.OK (200) on successful GET
+     *         <p>
+     *         HttpStatus.INTERNAL_SERVER_ERROR (500) if unmarshalling Service Data
+     *         from the database fails
+     *         <p>
+     *         HttpStatus.NOT_FOUND (404) if {@code serviceInstanceId, networkId}
+     *         does not exist.
+     */
+    @Override
+    public ResponseEntity<Void> configGENERICRESOURCEAPIservicesServiceServiceInstanceIdServiceDataNetworksNetworkNetworkIdNetworkDataNetworkLevelOperStatusPost(
+            String serviceInstanceId, String networkId, @Valid GenericResourceApiOperStatusData operStatusData)
+            throws RestException {
+        log.info("POST | Network level oper status Data for ({}, {})", serviceInstanceId, networkId);
+
+        List<ConfigServices> services = configServicesRepository.findBySvcInstanceId(serviceInstanceId);
+        ConfigServices data;
+
+        if ((services == null) || (services.isEmpty())) {
+            log.info("Could not find data for ({}).", serviceInstanceId);
+            // Or throw the data not found error?
+            throw new RestProtocolException("data-missing", "Service Instance ID not found.",
+                    HttpStatus.NOT_FOUND.value());
+        } else {
+            data = services.get(0);
+        }
+
+        if (!serviceDataHelper.hasServiceData(data)) {
+            log.info("Could not find Service Data for ({}).", serviceInstanceId);
+            throw new RestProtocolException("data-missing", "Service data not found.", HttpStatus.NOT_FOUND.value());
+        }
+        GenericResourceApiServicedataServicedataNetworksNetwork network = null;
+        try {
+            network = serviceDataHelper.getNetwork(serviceInstanceId, networkId);
+        } catch (JsonProcessingException e) {
+            log.error("Could not parse service data", e);
+            throw new RestApplicationException("data-conversion",
+                    "Request could not be completed due to internal error", e,
+                    HttpStatus.INTERNAL_SERVER_ERROR.value());
+        }
+
+        if (network == null) {
+            log.info("No information found for {}", networkId);
+            throw new RestApplicationException("data-missing",
+                    "Request could not be completed because the relevant data model content does not exist",
+                    HttpStatus.NOT_FOUND.value());
+        }
+
+        GenericResourceApiServicedataServicedataNetworksNetworkNetworkData networkData = network.getNetworkData();
+        if (networkData == null) {
+            networkData = new GenericResourceApiServicedataServicedataNetworksNetworkNetworkData();
+        }
+
+        networkData.setNetworkLevelOperStatus(operStatusData);
+        network.setNetworkData(networkData);
+        try {
+            serviceDataHelper.saveNetwork(serviceInstanceId, network, null);
+        } catch (JsonProcessingException e) {
+            log.error("Could not parse service data", e);
+            throw new RestApplicationException("data-conversion",
+                    "Request could not be completed due to internal error", e,
+                    HttpStatus.INTERNAL_SERVER_ERROR.value());
+        }
+
+        return new ResponseEntity<>(HttpStatus.CREATED);
+    }
+
+    /**
+     * Put network oper status data from the Config table specified Service Instance
+     * and network id
+     * <p>
+     * Maps to
+     * /config/GENERIC-RESOURCE-API:services/service/{service-instance-id}/service-data/networks/network/{network-id}/network-data/network-level-oper-status/
+     * 
+     * @param serviceInstanceId the Service Instance ID to put to
+     * @param networkId         the network ID to put to
+     * @param operStatus        the oper status to set
+     * @return HttpStatus.OK (200) on successful PUT
+     *         <p>
+     *         HttpStatus.INTERNAL_SERVER_ERROR (500) if unmarshalling Service Data
+     *         from the database fails
+     *         <p>
+     *         HttpStatus.NOT_FOUND (404) if {@code serviceInstanceId, networkId}
+     *         does not exist.
+     */
+    @Override
+    public ResponseEntity<Void> configGENERICRESOURCEAPIservicesServiceServiceInstanceIdServiceDataNetworksNetworkNetworkIdNetworkDataNetworkLevelOperStatusPut(
+            String serviceInstanceId, String networkId, @Valid GenericResourceApiOperStatusData operStatusData)
+            throws RestException {
+        log.info("PUT | Network level oper status Data for ({}, {})", serviceInstanceId, networkId);
+
+        List<ConfigServices> services = configServicesRepository.findBySvcInstanceId(serviceInstanceId);
+        ConfigServices data;
+        if ((services == null) || (services.isEmpty())) {
+            log.info("Could not find data for ({}).", serviceInstanceId);
+            // Or throw the data not found error?
+            throw new RestProtocolException("data-missing", "Service Instance ID not found.",
+                    HttpStatus.NOT_FOUND.value());
+        } else {
+            data = services.get(0);
+        }
+
+        if (!serviceDataHelper.hasServiceData(data)) {
+            log.info("Could not find Service Data for ({}).", serviceInstanceId);
+            throw new RestProtocolException("data-missing", "Service data not found.", HttpStatus.NOT_FOUND.value());
+        }
+        GenericResourceApiServicedataServicedataNetworksNetwork network = null;
+        try {
+            network = serviceDataHelper.getNetwork(serviceInstanceId, networkId);
+        } catch (JsonProcessingException e) {
+            log.error("Could not parse service data", e);
+            throw new RestApplicationException("data-conversion",
+                    "Request could not be completed due to internal error", e,
+                    HttpStatus.INTERNAL_SERVER_ERROR.value());
+        }
+
+        if (network == null) {
+            log.info("No information found for {}", networkId);
+            throw new RestApplicationException("data-missing",
+                    "Request could not be completed because the relevant data model content does not exist",
+                    HttpStatus.NOT_FOUND.value());
+        }
+
+        GenericResourceApiServicedataServicedataNetworksNetworkNetworkData networkData = network.getNetworkData();
+        if (networkData == null) {
+            networkData = new GenericResourceApiServicedataServicedataNetworksNetworkNetworkData();
+        }
+
+        networkData.setNetworkLevelOperStatus(operStatusData);
+        network.setNetworkData(networkData);
+        try {
+            serviceDataHelper.saveNetwork(serviceInstanceId, network, null);
+        } catch (JsonProcessingException e) {
+            log.error("Could not parse service data", e);
+            throw new RestApplicationException("data-conversion",
+                    "Request could not be completed due to internal error", e,
+                    HttpStatus.INTERNAL_SERVER_ERROR.value());
+        }
+
+        return new ResponseEntity<>(HttpStatus.CREATED);
+    }
+
+    /**
+     * Delete network oper status data from the Config table specified Service
+     * Instance and network id
+     * <p>
+     * Maps to
+     * /config/GENERIC-RESOURCE-API:services/service/{service-instance-id}/service-data/networks/network/{network-id}/network-data/network-level-oper-status/
+     * 
+     * @param serviceInstanceId the Service Instance ID to delete
+     * @param networkId         the Service Instance ID to delete
+     * @return HttpStatus.OK (200) on successful GET
+     *         <p>
+     *         HttpStatus.INTERNAL_SERVER_ERROR (500) if unmarshalling Service Data
+     *         from the database fails
+     *         <p>
+     *         HttpStatus.NOT_FOUND (404) if {@code serviceInstanceId, networkId}
+     *         does not exist.
+     */
+    @Override
+    public ResponseEntity<Void> configGENERICRESOURCEAPIservicesServiceServiceInstanceIdServiceDataNetworksNetworkNetworkIdNetworkDataNetworkProvidedAllottedResourcesDelete(
+            String serviceInstanceId, String networkId) throws RestException {
+        log.info("DELETE | Network provided allotted resource Data for ({}, {})", serviceInstanceId, networkId);
+
+        List<ConfigServices> services = configServicesRepository.findBySvcInstanceId(serviceInstanceId);
+        ConfigServices data;
+        if ((services == null) || (services.isEmpty())) {
+            log.info("Could not find data for ({}).", serviceInstanceId);
+            // Or throw the data not found error?
+            throw new RestProtocolException("data-missing", "Service Instance ID not found.",
+                    HttpStatus.NOT_FOUND.value());
+        } else {
+            data = services.get(0);
+        }
+
+        if (!serviceDataHelper.hasServiceData(data)) {
+            log.info("Could not find Service Data for ({}).", serviceInstanceId);
+            throw new RestProtocolException("data-missing", "Service data not found.", HttpStatus.NOT_FOUND.value());
+        }
+        GenericResourceApiServicedataServicedataNetworksNetwork network = null;
+        try {
+            network = serviceDataHelper.getNetwork(serviceInstanceId, networkId);
+        } catch (JsonProcessingException e) {
+            log.error("Could not parse service data", e);
+            throw new RestApplicationException("data-conversion",
+                    "Request could not be completed due to internal error", e,
+                    HttpStatus.INTERNAL_SERVER_ERROR.value());
+        }
+
+        if (network == null) {
+            log.info("No information found for {}", networkId);
+            throw new RestApplicationException("data-missing",
+                    "Request could not be completed because the relevant data model content does not exist",
+                    HttpStatus.NOT_FOUND.value());
+        }
+
+        if (network.getNetworkData() != null) {
+            network.getNetworkData().setNetworkProvidedAllottedResources(null);
+            try {
+                serviceDataHelper.saveNetwork(serviceInstanceId, network, null);
+            } catch (JsonProcessingException e) {
+                log.error("Could not parse service data", e);
+                throw new RestApplicationException("data-conversion",
+                        "Request could not be completed due to internal error", e,
+                        HttpStatus.INTERNAL_SERVER_ERROR.value());
+            }
+        }
+        return new ResponseEntity<>(HttpStatus.NO_CONTENT);
+    }
+
+    @Override
+    public ResponseEntity<GenericResourceApiServicedataServicedataNetworksNetworkNetworkdataNetworkProvidedAllottedResources> configGENERICRESOURCEAPIservicesServiceServiceInstanceIdServiceDataNetworksNetworkNetworkIdNetworkDataNetworkProvidedAllottedResourcesGet(
+            String serviceInstanceId, String networkId) throws RestException {
+        log.info("GET | Network provided allotted resources for serviceInstanceId, networkId ({})", serviceInstanceId,
+                networkId);
+
+        List<ConfigServices> services = configServicesRepository.findBySvcInstanceId(serviceInstanceId);
+        if ((services == null) || (services.isEmpty())) {
+            throw new RestProtocolException("data-missing", "No service entry found", HttpStatus.NOT_FOUND.value());
+        }
+
+        GenericResourceApiServicedataServicedataNetworksNetwork network = null;
+        try {
+            network = serviceDataHelper.getNetwork(serviceInstanceId, networkId);
+        } catch (JsonProcessingException e) {
+            log.error("Could not parse service data", e);
+            throw new RestApplicationException("data-conversion",
+                    "Request could not be completed due to internal error", e,
+                    HttpStatus.INTERNAL_SERVER_ERROR.value());
+        }
+
+        if (network == null) {
+            log.info("No information found for {}", networkId);
+            throw new RestApplicationException("data-missing",
+                    "Request could not be completed because the relevant data model content does not exist",
+                    HttpStatus.NOT_FOUND.value());
+        }
+
+        GenericResourceApiServicedataServicedataNetworksNetworkNetworkData networkData = network.getNetworkData();
+        if (networkData == null) {
+            log.info("No network-data  found for {}", networkId);
+            throw new RestApplicationException("data-missing",
+                    "Request could not be completed because the relevant data model content does not exist",
+                    HttpStatus.NOT_FOUND.value());
+        }
+
+        return new ResponseEntity<>(networkData.getNetworkProvidedAllottedResources(), HttpStatus.OK);
+    }
+
+    @Override
+    public ResponseEntity<Void> configGENERICRESOURCEAPIservicesServiceServiceInstanceIdServiceDataNetworksNetworkNetworkIdNetworkDataNetworkProvidedAllottedResourcesPost(
+            String serviceInstanceId, String networkId,
+            @Valid GenericResourceApiServicedataServicedataNetworksNetworkNetworkdataNetworkProvidedAllottedResources netAllottedResources)
+            throws RestException {
+        log.info("POST | Network provided allotted resource Data for ({}, {})", serviceInstanceId, networkId);
+
+        List<ConfigServices> services = configServicesRepository.findBySvcInstanceId(serviceInstanceId);
+        ConfigServices data;
+        if ((services == null) || (services.isEmpty())) {
+            log.info("Could not find data for ({}).", serviceInstanceId);
+            // Or throw the data not found error?
+            throw new RestProtocolException("data-missing", "Service Instance ID not found.",
+                    HttpStatus.NOT_FOUND.value());
+        } else {
+            data = services.get(0);
+        }
+
+        if (!serviceDataHelper.hasServiceData(data)) {
+            log.info("Could not find Service Data for ({}).", serviceInstanceId);
+            throw new RestProtocolException("data-missing", "Service data not found.", HttpStatus.NOT_FOUND.value());
+        }
+        GenericResourceApiServicedataServicedataNetworksNetwork network = null;
+        try {
+            network = serviceDataHelper.getNetwork(serviceInstanceId, networkId);
+        } catch (JsonProcessingException e) {
+            log.error("Could not parse service data", e);
+            throw new RestApplicationException("data-conversion",
+                    "Request could not be completed due to internal error", e,
+                    HttpStatus.INTERNAL_SERVER_ERROR.value());
+        }
+
+        if (network == null) {
+            log.info("No information found for {}", networkId);
+            throw new RestApplicationException("data-missing",
+                    "Request could not be completed because the relevant data model content does not exist",
+                    HttpStatus.NOT_FOUND.value());
+        }
+
+        GenericResourceApiServicedataServicedataNetworksNetworkNetworkData networkData = network.getNetworkData();
+        if (networkData == null) {
+            networkData = new GenericResourceApiServicedataServicedataNetworksNetworkNetworkData();
+        }
+
+        networkData.setNetworkProvidedAllottedResources(netAllottedResources);
+        network.setNetworkData(networkData);
+        try {
+            serviceDataHelper.saveNetwork(serviceInstanceId, network, null);
+        } catch (JsonProcessingException e) {
+            log.error("Could not parse service data", e);
+            throw new RestApplicationException("data-conversion",
+                    "Request could not be completed due to internal error", e,
+                    HttpStatus.INTERNAL_SERVER_ERROR.value());
+        }
+
+        return new ResponseEntity<>(HttpStatus.CREATED);
+    }
+
+    @Override
+    public ResponseEntity<Void> configGENERICRESOURCEAPIservicesServiceServiceInstanceIdServiceDataNetworksNetworkNetworkIdNetworkDataNetworkProvidedAllottedResourcesPut(
+            String serviceInstanceId, String networkId,
+            @Valid GenericResourceApiServicedataServicedataNetworksNetworkNetworkdataNetworkProvidedAllottedResources netAllottedResources)
+            throws RestException {
+        log.info("POST | Network provided allotted resource Data for ({}, {})", serviceInstanceId, networkId);
+
+        List<ConfigServices> services = configServicesRepository.findBySvcInstanceId(serviceInstanceId);
+        ConfigServices data;
+        if ((services == null) || (services.isEmpty())) {
+            log.info("Could not find data for ({}).", serviceInstanceId);
+            // Or throw the data not found error?
+            throw new RestProtocolException("data-missing", "Service Instance ID not found.",
+                    HttpStatus.NOT_FOUND.value());
+        } else {
+            data = services.get(0);
+        }
+
+        if (!serviceDataHelper.hasServiceData(data)) {
+            log.info("Could not find Service Data for ({}).", serviceInstanceId);
+            throw new RestProtocolException("data-missing", "Service data not found.", HttpStatus.NOT_FOUND.value());
+        }
+        GenericResourceApiServicedataServicedataNetworksNetwork network = null;
+        try {
+            network = serviceDataHelper.getNetwork(serviceInstanceId, networkId);
+        } catch (JsonProcessingException e) {
+            log.error("Could not parse service data", e);
+            throw new RestApplicationException("data-conversion",
+                    "Request could not be completed due to internal error", e,
+                    HttpStatus.INTERNAL_SERVER_ERROR.value());
+        }
+
+        if (network == null) {
+            log.info("No information found for {}", networkId);
+            throw new RestApplicationException("data-missing",
+                    "Request could not be completed because the relevant data model content does not exist",
+                    HttpStatus.NOT_FOUND.value());
+        }
+
+        GenericResourceApiServicedataServicedataNetworksNetworkNetworkData networkData = network.getNetworkData();
+        if (networkData == null) {
+            networkData = new GenericResourceApiServicedataServicedataNetworksNetworkNetworkData();
+        }
+
+        networkData.setNetworkProvidedAllottedResources(netAllottedResources);
+        network.setNetworkData(networkData);
+        try {
+            serviceDataHelper.saveNetwork(serviceInstanceId, network, null);
+        } catch (JsonProcessingException e) {
+            log.error("Could not parse service data", e);
+            throw new RestApplicationException("data-conversion",
+                    "Request could not be completed due to internal error", e,
+                    HttpStatus.INTERNAL_SERVER_ERROR.value());
+        }
+
+        return new ResponseEntity<>(HttpStatus.CREATED);
+    }
+
+    /**
+     * Delete network topology identifier structure from service data based on
+     * service Instance and network id
+     * <p>
+     * Maps to
+     * /config/GENERIC-RESOURCE-API:services/service/{service-instance-id}/service-data/networks/network/{network-id}/network-data/network-topology/network-topology-identifier-structure/
+     * 
+     * @param serviceInstanceId the Service Instance ID to delete
+     * @param networkId         the network ID to delete
+     * @return HttpStatus.OK (200) on successful GET
+     *         <p>
+     *         HttpStatus.INTERNAL_SERVER_ERROR (500) if unmarshalling Service Data
+     *         from the database fails
+     *         <p>
+     *         HttpStatus.NOT_FOUND (404) if {@code serviceInstanceId, networkId}
+     *         does not exist.
+     */
+    @Override
+    public ResponseEntity<Void> configGENERICRESOURCEAPIservicesServiceServiceInstanceIdServiceDataNetworksNetworkNetworkIdNetworkDataNetworkTopologyNetworkTopologyIdentifierStructureDelete(
+            String serviceInstanceId, String networkId) throws RestException {
+        log.info("DELETE | Network topology identifier structure for ({}, {})", serviceInstanceId, networkId);
+
+        List<ConfigServices> services = configServicesRepository.findBySvcInstanceId(serviceInstanceId);
+        ConfigServices data;
+        if ((services == null) || (services.isEmpty())) {
+            log.info("Could not find data for ({}).", serviceInstanceId);
+            // Or throw the data not found error?
+            throw new RestProtocolException("data-missing", "Service Instance ID not found.",
+                    HttpStatus.NOT_FOUND.value());
+        } else {
+            data = services.get(0);
+        }
+
+        if (!serviceDataHelper.hasServiceData(data)) {
+            log.info("Could not find Service Data for ({}).", serviceInstanceId);
+            throw new RestProtocolException("data-missing", "Service data not found.", HttpStatus.NOT_FOUND.value());
+        }
+        GenericResourceApiServicedataServicedataNetworksNetwork network = null;
+        try {
+            network = serviceDataHelper.getNetwork(serviceInstanceId, networkId);
+        } catch (JsonProcessingException e) {
+            log.error("Could not parse service data", e);
+            throw new RestApplicationException("data-conversion",
+                    "Request could not be completed due to internal error", e,
+                    HttpStatus.INTERNAL_SERVER_ERROR.value());
+        }
+
+        if (network == null) {
+            log.info("No information found for {}", networkId);
+            throw new RestApplicationException("data-missing",
+                    "Request could not be completed because the relevant data model content does not exist",
+                    HttpStatus.NOT_FOUND.value());
+        }
+
+        if (network.getNetworkData() != null) {
+            GenericResourceApiNetworktopologyNetworkTopology netTopology = network.getNetworkData()
+                    .getNetworkTopology();
+            if (netTopology == null) {
+
+                log.info("No network-topology found for {}", networkId);
+                throw new RestApplicationException("data-missing",
+                        "Request could not be completed because the relevant data model content does not exist",
+                        HttpStatus.NOT_FOUND.value());
+            }
+            netTopology.setNetworkTopologyIdentifierStructure(null);
+            try {
+                serviceDataHelper.saveNetwork(serviceInstanceId, network, null);
+            } catch (JsonProcessingException e) {
+                log.error("Could not parse service data", e);
+                throw new RestApplicationException("data-conversion",
+                        "Request could not be completed due to internal error", e,
+                        HttpStatus.INTERNAL_SERVER_ERROR.value());
+            }
+        }
+        return new ResponseEntity<>(HttpStatus.NO_CONTENT);
+    }
+
+    /**
+     * Get network topology identifier structure from service data based on service
+     * Instance and network id
+     * <p>
+     * Maps to
+     * /config/GENERIC-RESOURCE-API:services/service/{service-instance-id}/service-data/networks/network/{network-id}/network-data/network-topology/network-topology-identifier-structure/
+     * 
+     * @param serviceInstanceId the Service Instance ID to update
+     * @param networkId         the network ID to update
+     * @return HttpStatus.OK (200) on successful GET
+     *         <p>
+     *         HttpStatus.INTERNAL_SERVER_ERROR (500) if unmarshalling Service Data
+     *         from the database fails
+     *         <p>
+     *         HttpStatus.NOT_FOUND (404) if {@code serviceInstanceId, networkId}
+     *         does not exist.
+     */
+    @Override
+    public ResponseEntity<GenericResourceApiNetworktopologyidentifierstructureNetworkTopologyIdentifierStructure> configGENERICRESOURCEAPIservicesServiceServiceInstanceIdServiceDataNetworksNetworkNetworkIdNetworkDataNetworkTopologyNetworkTopologyIdentifierStructureGet(
+            String serviceInstanceId, String networkId) throws RestException {
+        log.info("GET | Network topology identifier structure for ({}, {})", serviceInstanceId, networkId);
+
+        List<ConfigServices> services = configServicesRepository.findBySvcInstanceId(serviceInstanceId);
+        ConfigServices data;
+        if ((services == null) || (services.isEmpty())) {
+            log.info("Could not find data for ({}).", serviceInstanceId);
+            // Or throw the data not found error?
+            throw new RestProtocolException("data-missing", "Service Instance ID not found.",
+                    HttpStatus.NOT_FOUND.value());
+        } else {
+            data = services.get(0);
+        }
+
+        if (!serviceDataHelper.hasServiceData(data)) {
+            log.info("Could not find Service Data for ({}).", serviceInstanceId);
+            throw new RestProtocolException("data-missing", "Service data not found.", HttpStatus.NOT_FOUND.value());
+        }
+        GenericResourceApiServicedataServicedataNetworksNetwork network = null;
+        try {
+            network = serviceDataHelper.getNetwork(serviceInstanceId, networkId);
+        } catch (JsonProcessingException e) {
+            log.error("Could not parse service data", e);
+            throw new RestApplicationException("data-conversion",
+                    "Request could not be completed due to internal error", e,
+                    HttpStatus.INTERNAL_SERVER_ERROR.value());
+        }
+
+        if (network == null) {
+            log.info("No information found for {}", networkId);
+            throw new RestApplicationException("data-missing",
+                    "Request could not be completed because the relevant data model content does not exist",
+                    HttpStatus.NOT_FOUND.value());
+        }
+
+        if (network.getNetworkData() != null) {
+            GenericResourceApiNetworktopologyNetworkTopology netTopology = network.getNetworkData()
+                    .getNetworkTopology();
+            if (netTopology == null) {
+
+                log.info("No network-topology found for {}", networkId);
+                throw new RestApplicationException("data-missing",
+                        "Request could not be completed because the relevant data model content does not exist",
+                        HttpStatus.NOT_FOUND.value());
+            }
+            return new ResponseEntity<>(netTopology.getNetworkTopologyIdentifierStructure(), HttpStatus.OK);
+        }
+        return new ResponseEntity<>(null, HttpStatus.OK);
+    }
+
+    /**
+     * Post network topology identifier structure from service data based on service
+     * Instance and network id
+     * <p>
+     * Maps to
+     * /config/GENERIC-RESOURCE-API:services/service/{service-instance-id}/service-data/networks/network/{network-id}/network-data/network-topology/network-topology-identifier-structure/
+     * 
+     * @param serviceInstanceId              the Service Instance ID to update
+     * @param networkId                      the network ID to update
+     * @param netTopologyIdentifierStructure the network topology identifier
+     *                                       structure to set
+     * @return HttpStatus.CREATED (201) on successful POST
+     *         <p>
+     *         HttpStatus.INTERNAL_SERVER_ERROR (500) if unmarshalling Service Data
+     *         from the database fails
+     *         <p>
+     *         HttpStatus.NOT_FOUND (404) if {@code serviceInstanceId, networkId}
+     *         does not exist.
+     */
+    @Override
+    public ResponseEntity<Void> configGENERICRESOURCEAPIservicesServiceServiceInstanceIdServiceDataNetworksNetworkNetworkIdNetworkDataNetworkTopologyNetworkTopologyIdentifierStructurePost(
+            String serviceInstanceId, String networkId,
+            @Valid GenericResourceApiNetworktopologyidentifierstructureNetworkTopologyIdentifierStructure netTopologyIdentifierStructure)
+            throws RestException {
+        log.info("POST | Network topology identifier structure for ({}, {})", serviceInstanceId, networkId);
+
+        List<ConfigServices> services = configServicesRepository.findBySvcInstanceId(serviceInstanceId);
+        ConfigServices data;
+        if ((services == null) || (services.isEmpty())) {
+            log.info("Could not find data for ({}).", serviceInstanceId);
+            // Or throw the data not found error?
+            throw new RestProtocolException("data-missing", "Service Instance ID not found.",
+                    HttpStatus.NOT_FOUND.value());
+        } else {
+            data = services.get(0);
+        }
+
+        if (!serviceDataHelper.hasServiceData(data)) {
+            log.info("Could not find Service Data for ({}).", serviceInstanceId);
+            throw new RestProtocolException("data-missing", "Service data not found.", HttpStatus.NOT_FOUND.value());
+        }
+        GenericResourceApiServicedataServicedataNetworksNetwork network = null;
+        try {
+            network = serviceDataHelper.getNetwork(serviceInstanceId, networkId);
+        } catch (JsonProcessingException e) {
+            log.error("Could not parse service data", e);
+            throw new RestApplicationException("data-conversion",
+                    "Request could not be completed due to internal error", e,
+                    HttpStatus.INTERNAL_SERVER_ERROR.value());
+        }
+
+        if (network == null) {
+            log.info("No information found for {}", networkId);
+            throw new RestApplicationException("data-missing",
+                    "Request could not be completed because the relevant data model content does not exist",
+                    HttpStatus.NOT_FOUND.value());
+        }
+
+        if (network.getNetworkData() != null) {
+            GenericResourceApiNetworktopologyNetworkTopology netTopology = network.getNetworkData()
+                    .getNetworkTopology();
+            if (netTopology == null) {
+
+                log.info("No network-topology found for {}", networkId);
+                throw new RestApplicationException("data-missing",
+                        "Request could not be completed because the relevant data model content does not exist",
+                        HttpStatus.NOT_FOUND.value());
+            }
+            netTopology.setNetworkTopologyIdentifierStructure(netTopologyIdentifierStructure);
+            try {
+                serviceDataHelper.saveNetwork(serviceInstanceId, network, null);
+            } catch (JsonProcessingException e) {
+                log.error("Could not parse service data", e);
+                throw new RestApplicationException("data-conversion",
+                        "Request could not be completed due to internal error", e,
+                        HttpStatus.INTERNAL_SERVER_ERROR.value());
+            }
+        }
+        return new ResponseEntity<>(HttpStatus.CREATED);
+    }
+
+    /**
+     * Put network topology identifier structure from service data based on service
+     * Instance and network id
+     * <p>
+     * Maps to
+     * /config/GENERIC-RESOURCE-API:services/service/{service-instance-id}/service-data/networks/network/{network-id}/network-data/network-topology/network-topology-identifier-structure/
+     * 
+     * @param serviceInstanceId              the Service Instance ID to update
+     * @param networkId                      the network ID to update
+     * @param netTopologyIdentifierStructure the network topology identifier
+     *                                       structure to set
+     * @return HttpStatus.CREATED (201) on successful POST
+     *         <p>
+     *         HttpStatus.INTERNAL_SERVER_ERROR (500) if unmarshalling Service Data
+     *         from the database fails
+     *         <p>
+     *         HttpStatus.NOT_FOUND (404) if {@code serviceInstanceId, networkId}
+     *         does not exist.
+     */
+    @Override
+    public ResponseEntity<Void> configGENERICRESOURCEAPIservicesServiceServiceInstanceIdServiceDataNetworksNetworkNetworkIdNetworkDataNetworkTopologyNetworkTopologyIdentifierStructurePut(
+            String serviceInstanceId, String networkId,
+            @Valid GenericResourceApiNetworktopologyidentifierstructureNetworkTopologyIdentifierStructure netTopologyIdentifierStructure)
+            throws RestException {
+        log.info("PUT | Network topology identifier structure for ({}, {})", serviceInstanceId, networkId);
+
+        List<ConfigServices> services = configServicesRepository.findBySvcInstanceId(serviceInstanceId);
+        ConfigServices data;
+        if ((services == null) || (services.isEmpty())) {
+            log.info("Could not find data for ({}).", serviceInstanceId);
+            // Or throw the data not found error?
+            throw new RestProtocolException("data-missing", "Service Instance ID not found.",
+                    HttpStatus.NOT_FOUND.value());
+        } else {
+            data = services.get(0);
+        }
+
+        if (!serviceDataHelper.hasServiceData(data)) {
+            log.info("Could not find Service Data for ({}).", serviceInstanceId);
+            throw new RestProtocolException("data-missing", "Service data not found.", HttpStatus.NOT_FOUND.value());
+        }
+        GenericResourceApiServicedataServicedataNetworksNetwork network = null;
+        try {
+            network = serviceDataHelper.getNetwork(serviceInstanceId, networkId);
+        } catch (JsonProcessingException e) {
+            log.error("Could not parse service data", e);
+            throw new RestApplicationException("data-conversion",
+                    "Request could not be completed due to internal error", e,
+                    HttpStatus.INTERNAL_SERVER_ERROR.value());
+        }
+
+        if (network == null) {
+            log.info("No information found for {}", networkId);
+            throw new RestApplicationException("data-missing",
+                    "Request could not be completed because the relevant data model content does not exist",
+                    HttpStatus.NOT_FOUND.value());
+        }
+
+        if (network.getNetworkData() != null) {
+            GenericResourceApiNetworktopologyNetworkTopology netTopology = network.getNetworkData()
+                    .getNetworkTopology();
+            if (netTopology == null) {
+
+                log.info("No network-topology found for {}", networkId);
+                throw new RestApplicationException("data-missing",
+                        "Request could not be completed because the relevant data model content does not exist",
+                        HttpStatus.NOT_FOUND.value());
+            }
+            netTopology.setNetworkTopologyIdentifierStructure(netTopologyIdentifierStructure);
+            try {
+                serviceDataHelper.saveNetwork(serviceInstanceId, network, null);
+            } catch (JsonProcessingException e) {
+                log.error("Could not parse service data", e);
+                throw new RestApplicationException("data-conversion",
+                        "Request could not be completed due to internal error", e,
+                        HttpStatus.INTERNAL_SERVER_ERROR.value());
+            }
+        }
+        return new ResponseEntity<>(HttpStatus.CREATED);
+    }
+
+    /**
+     * Deletes VNF data from the Config table specified Service Instance.
+     * <p>
+     * Maps to
+     * /config/GENERIC-RESOURCE-API:services/service/{service-instance-id}/service-data/vnfs/vnf/{vnf-id}/
+     * 
+     * @param serviceInstanceId the Service Instance ID to perform the delete on
+     * @param vnfId             the VNF ID of the VNF to delete
+     * @return HttpStatus.NO_CONTENT (204) on successful delete
+     *         <p>
+     *         HttpStatus.BAD_REQUEST (400) if unmarshalling Service Data from the
+     *         database fails, there is no VNF data for {@code vnfId}, or writing
+     *         Service Data back to the database fails.
+     *         <p>
+     *         HttpStatus.NOT_FOUND (404) if {@code serviceInstanceId} does not
+     *         exist.
+     */
+    @Override
+    public ResponseEntity<Void> configGENERICRESOURCEAPIservicesServiceServiceInstanceIdServiceDataVnfsVnfVnfIdDelete(
+            String serviceInstanceId, String vnfId) throws RestException {
+        log.info("DELETE | VNF Data for ({})", vnfId);
+
+        List<ConfigServices> services = configServicesRepository.findBySvcInstanceId(serviceInstanceId);
+        ConfigServices data;
+        if ((services == null) || (services.isEmpty())) {
+            log.info("Could not find data for ({}).", serviceInstanceId);
+            // Or throw the data not found error?
+            throw new RestProtocolException("data-missing", "Service Instance ID not found.",
+                    HttpStatus.NOT_FOUND.value());
+        } else {
+            data = services.get(0);
+        }
+
+        if (!serviceDataHelper.hasServiceData(data)) {
+            log.info("Could not find Service Data for ({}).", serviceInstanceId);
+            throw new RestProtocolException("data-missing", "Service data not found.", HttpStatus.NOT_FOUND.value());
+        }
+
+        if (serviceDataHelper.deleteVnf(serviceInstanceId, vnfId) > 0) {
+            return new ResponseEntity<>(HttpStatus.NO_CONTENT);
+        } else {
+            // Data was not found
+            log.error("Did not find VNF ({}) in data.", vnfId);
+            throw new RestProtocolException("data-missing", "VNF ID not found.", HttpStatus.NOT_FOUND.value());
+        }
+    }
+
+    /**
+     * Extracts VNF data from the Config table specified Service Instance.
+     * <p>
+     * Maps to
+     * /config/GENERIC-RESOURCE-API:services/service/{service-instance-id}/service-data/vnfs/vnf/{vnf-id}/
+     * 
+     * @param serviceInstanceId the Service Instance ID to lookup data for
+     * @param vnfId             the VNF ID of the VNF to return
+     * @return HttpStatus.OK (200) if the data is found.
+     * @throws RestException if the data does not exist.
+     */
+    @Override
+    public ResponseEntity<GenericResourceApiServicedataServicedataVnfsVnf> configGENERICRESOURCEAPIservicesServiceServiceInstanceIdServiceDataVnfsVnfVnfIdGet(
+            String serviceInstanceId, String vnfId) throws RestException {
+        log.info("GET | VNF Data for ({})", vnfId);
 
         List<ConfigServices> services = configServicesRepository.findBySvcInstanceId(serviceInstanceId);
         if ((services == null) || (services.isEmpty())) {
@@ -1317,22 +3502,30 @@ public class ConfigApiController implements ConfigApi {
      * Instance. If it is a new Service Instance or a new VNF, creates all necessary
      * parent data containers, then performs the updates.
      * <p>
-     * Maps to /config/GENERIC-RESOURCE-API:services/service/{service-instance-id}/service-data/vnfs/vnf/{vnf-id}/
-     * @param serviceInstanceId the Service Instance ID to perform the delete on
-     * @param vnfId the VNF ID of the VNF to delete
+     * Maps to
+     * /config/GENERIC-RESOURCE-API:services/service/{service-instance-id}/service-data/vnfs/vnf/{vnf-id}/
+     * 
+     * @param serviceInstanceId                                        the Service
+     *                                                                 Instance ID
+     *                                                                 to perform
+     *                                                                 the delete on
+     * @param vnfId                                                    the VNF ID of
+     *                                                                 the VNF to
+     *                                                                 delete
      * @param genericResourceApiServicedataServicedataVnfsVnfBodyParam the playload
      * @return HttpStatus.CREATED (201) on successful create
-     * <p>
-     * HttpStatus.NO_CONTENT (204) on successful update
-     * <p>
-     * HttpStatus.BAD_REQUEST (400) if {@code vnfId} does not match what is specified in the
-     * {@code genericResourceApiServicedataServicedataVnfsVnfBodyParam} , or if updating the database fails.
+     *         <p>
+     *         HttpStatus.NO_CONTENT (204) on successful update
+     *         <p>
+     *         HttpStatus.BAD_REQUEST (400) if {@code vnfId} does not match what is
+     *         specified in the
+     *         {@code genericResourceApiServicedataServicedataVnfsVnfBodyParam} , or
+     *         if updating the database fails.
      * @throws RestException
      */
     @Override
     public ResponseEntity<Void> configGENERICRESOURCEAPIservicesServiceServiceInstanceIdServiceDataVnfsVnfVnfIdPut(
-            String serviceInstanceId, String vnfId,
-            GenericResourceApiServicedataServicedataVnfsVnf vnf)
+            String serviceInstanceId, String vnfId, GenericResourceApiServicedataServicedataVnfsVnf vnf)
             throws RestException {
         log.info("PUT | VNF Data for ({})", vnfId);
         if (!vnfId.equals(vnf.getVnfId())) {
@@ -1388,7 +3581,7 @@ public class ConfigApiController implements ConfigApi {
         }
 
         GenericResourceApiServicedataServicedataVnfsVnf vnf = null;
-        
+
         try {
             vnf = serviceDataHelper.getVnf(serviceInstanceId, vnfId);
         } catch (JsonProcessingException e) {
@@ -1417,11 +3610,9 @@ public class ConfigApiController implements ConfigApi {
      * Maps to
      * /config/GENERIC-RESOURCE-API:services/service/{service-instance-id}/service-data/vnfs/vnf/{vnf-id}/vnf-data/vnf-level-oper-status/
      * 
-     * @param serviceInstanceId                         the Service Instance ID to
-     *                                                  perform the delete on
-     * @param vnfId                                     the VNF ID of the VNF to
-     *                                                  delete
-     * @param genericResourceApiOperStatusDataBodyParam the payload
+     * @param serviceInstanceId the Service Instance ID to perform the delete on
+     * @param vnfId             the VNF ID of the VNF to delete
+     * @param operStatus        the payload
      * @return HttpStatus.CREATED (201) on successful create.
      *         <p>
      *         HttpStatus.NO_CONTENT (204) on successful update.
@@ -1431,8 +3622,7 @@ public class ConfigApiController implements ConfigApi {
      */
     @Override
     public ResponseEntity<Void> configGENERICRESOURCEAPIservicesServiceServiceInstanceIdServiceDataVnfsVnfVnfIdVnfDataVnfLevelOperStatusPut(
-            String serviceInstanceId, String vnfId,
-            GenericResourceApiOperStatusData genericResourceApiOperStatusDataBodyParam) throws RestException {
+            String serviceInstanceId, String vnfId, GenericResourceApiOperStatusData operStatus) throws RestException {
         log.info("PUT | VNF Level Oper Status ({})", vnfId);
         ServiceDataTransaction transaction = serviceDataHelper.createTransaction();
 
@@ -1455,12 +3645,12 @@ public class ConfigApiController implements ConfigApi {
                 responseStatus = HttpStatus.CREATED;
                 vnf = new GenericResourceApiServicedataServicedataVnfsVnf();
                 vnf.setVnfId(vnfId);
-            } 
+            }
             GenericResourceApiServicedataServicedataVnfsVnfVnfData vnfData = vnf.getVnfData();
             if (vnfData == null) {
                 vnfData = new GenericResourceApiServicedataServicedataVnfsVnfVnfData();
             }
-            vnfData.setVnfLevelOperStatus(genericResourceApiOperStatusDataBodyParam);
+            vnfData.setVnfLevelOperStatus(operStatus);
             vnf.setVnfData(vnfData);
             serviceDataHelper.saveVnf(serviceInstanceId, vnf, transaction);
             transaction.commit();
@@ -1479,25 +3669,9 @@ public class ConfigApiController implements ConfigApi {
      * Maps to
      * /config/GENERIC-RESOURCE-API:services/service/{service-instance-id}/service-data/vnfs/vnf/{vnf-id}/vnf-data/vnf-topology/onap-model-information/
      * 
-     * @param serviceInstanceId                                                   the
-     *                                                                            Service
-     *                                                                            Instance
-     *                                                                            ID
-     *                                                                            to
-     *                                                                            perform
-     *                                                                            the
-     *                                                                            delete
-     *                                                                            on
-     * @param vnfId                                                               the
-     *                                                                            VNF
-     *                                                                            ID
-     *                                                                            of
-     *                                                                            the
-     *                                                                            VNF
-     *                                                                            to
-     *                                                                            delete
-     * @param genericResourceApiOnapmodelinformationOnapModelInformationBodyParam the
-     *                                                                            payload
+     * @param serviceInstanceId the Service Instance ID to perform the delete on
+     * @param vnfId             the VNF ID of the VNF to delete
+     * @param onapModelInfo     the payload
      * @return HttpStatus.CREATED (201) on successful create.
      *         <p>
      *         HttpStatus.NO_CONTENT (204) on successful update.
@@ -1508,8 +3682,7 @@ public class ConfigApiController implements ConfigApi {
     @Override
     public ResponseEntity<Void> configGENERICRESOURCEAPIservicesServiceServiceInstanceIdServiceDataVnfsVnfVnfIdVnfDataVnfTopologyOnapModelInformationPut(
             String serviceInstanceId, String vnfId,
-            GenericResourceApiOnapmodelinformationOnapModelInformation genericResourceApiOnapmodelinformationOnapModelInformationBodyParam)
-            throws RestException {
+            GenericResourceApiOnapmodelinformationOnapModelInformation onapModelInfo) throws RestException {
         log.info("PUT | VNF Topology Onap Model Information ({})", vnfId);
         ServiceDataTransaction transaction = serviceDataHelper.createTransaction();
 
@@ -1524,13 +3697,12 @@ public class ConfigApiController implements ConfigApi {
             data = services.get(0);
         }
 
-
         GenericResourceApiServicedataServicedataVnfsVnf vnf = null;
         HttpStatus responseStatus = HttpStatus.NO_CONTENT;
-        
+
         try {
             vnf = serviceDataHelper.getVnf(serviceInstanceId, vnfId);
-        } catch(JsonProcessingException e) {
+        } catch (JsonProcessingException e) {
 
             log.error("Could not parse service data", e);
             throw new RestApplicationException("data-conversion",
@@ -1546,8 +3718,7 @@ public class ConfigApiController implements ConfigApi {
             vnf.getVnfData().setVnfTopology(new GenericResourceApiVnftopologyVnfTopology());
         }
 
-        vnf.getVnfData().getVnfTopology()
-                .setOnapModelInformation(genericResourceApiOnapmodelinformationOnapModelInformationBodyParam);
+        vnf.getVnfData().getVnfTopology().setOnapModelInformation(onapModelInfo);
 
         // Save the updated VNF (and service, if new)
         try {
@@ -1566,21 +3737,23 @@ public class ConfigApiController implements ConfigApi {
      * Service Instance. If it is a new Service Instance or a new VNF, creates all
      * necessary parent data containers, then performs the updates.
      * <p>
-     * Maps to /config/GENERIC-RESOURCE-API:services/service/{service-instance-id}/service-data/vnfs/vnf/{vnf-id}/vnf-data/vnf-topology/vnf-resource-assignments/vnf-networks/
+     * Maps to
+     * /config/GENERIC-RESOURCE-API:services/service/{service-instance-id}/service-data/vnfs/vnf/{vnf-id}/vnf-data/vnf-topology/vnf-resource-assignments/vnf-networks/
+     * 
      * @param serviceInstanceId the Service Instance ID to perform the delete on
-     * @param vnfId the VNF ID of the VNF to delete
-     * @param genericResourceApiVnfresourceassignmentsVnfresourceassignmentsVnfNetworksBodyParam the * payload
+     * @param vnfId             the VNF ID of the VNF to delete
+     * @param vnfNetworks       the * payload
      * @return HttpStatus.CREATED (201) on successful create.
-     * <p>
-     * HttpStatus.NO_CONTENT (204) on successful update.
-     * <p>
-     * HttpStatus.BAD_REQUEST (400) if updating the database fails.
+     *         <p>
+     *         HttpStatus.NO_CONTENT (204) on successful update.
+     *         <p>
+     *         HttpStatus.BAD_REQUEST (400) if updating the database fails.
      * @throws RestException
      */
     @Override
     public ResponseEntity<Void> configGENERICRESOURCEAPIservicesServiceServiceInstanceIdServiceDataVnfsVnfVnfIdVnfDataVnfTopologyVnfResourceAssignmentsVnfNetworksPut(
             String serviceInstanceId, String vnfId,
-            GenericResourceApiVnfresourceassignmentsVnfresourceassignmentsVnfNetworks genericResourceApiVnfresourceassignmentsVnfresourceassignmentsVnfNetworksBodyParam)
+            GenericResourceApiVnfresourceassignmentsVnfresourceassignmentsVnfNetworks vnfNetworks)
             throws RestException {
         log.info("PUT | VNF Topology VNF Resource Assignments VNF Networks ({})", vnfId);
 
@@ -1601,7 +3774,7 @@ public class ConfigApiController implements ConfigApi {
 
         try {
             vnf = serviceDataHelper.getVnf(serviceInstanceId, vnfId);
-        } catch(JsonProcessingException e) {
+        } catch (JsonProcessingException e) {
 
             log.error("Could not parse service data", e);
             throw new RestApplicationException("data-conversion",
@@ -1625,11 +3798,12 @@ public class ConfigApiController implements ConfigApi {
             vnfTopology = new GenericResourceApiVnftopologyVnfTopology();
         }
 
-        GenericResourceApiVnfresourceassignmentsVnfResourceAssignments vnfResourceAssignments = vnfTopology.getVnfResourceAssignments();
+        GenericResourceApiVnfresourceassignmentsVnfResourceAssignments vnfResourceAssignments = vnfTopology
+                .getVnfResourceAssignments();
         if (vnfResourceAssignments == null) {
             vnfResourceAssignments = new GenericResourceApiVnfresourceassignmentsVnfResourceAssignments();
         }
-        vnfResourceAssignments.setVnfNetworks(genericResourceApiVnfresourceassignmentsVnfresourceassignmentsVnfNetworksBodyParam);
+        vnfResourceAssignments.setVnfNetworks(vnfNetworks);
         vnfTopology.setVnfResourceAssignments(vnfResourceAssignments);
         vnfData.setVnfTopology(vnfTopology);
         vnf.setVnfData(vnfData);
@@ -1654,11 +3828,9 @@ public class ConfigApiController implements ConfigApi {
      * Maps to
      * /config/GENERIC-RESOURCE-API:services/service/{service-instance-id}/service-data/vnfs/vnf/{vnf-id}/vnf-data/vnf-topology/vnf-resource-assignments/vnf-networks/vnf-network/{network-role}/
      * 
-     * @param serviceInstanceId                         the Service Instance ID to
-     *                                                  perform the delete on
-     * @param vnfId                                     the VNF ID of the VNF to
-     *                                                  delete
-     * @param genericResourceApiVnfNetworkDataBodyParam the payload
+     * @param serviceInstanceId the Service Instance ID to perform the delete on
+     * @param vnfId             the VNF ID of the VNF to delete
+     * @param vnfNetwork        the payload
      * @return HttpStatus.CREATED (201) on successful create.
      *         <p>
      *         HttpStatus.NO_CONTENT (204) on successful update.
@@ -1668,10 +3840,10 @@ public class ConfigApiController implements ConfigApi {
      */
     @Override
     public ResponseEntity<Void> configGENERICRESOURCEAPIservicesServiceServiceInstanceIdServiceDataVnfsVnfVnfIdVnfDataVnfTopologyVnfResourceAssignmentsVnfNetworksVnfNetworkNetworkRolePut(
-            String serviceInstanceId, String vnfId, String networkRole,
-            GenericResourceApiVnfNetworkData genericResourceApiVnfNetworkDataBodyParam) throws RestException {
+            String serviceInstanceId, String vnfId, String networkRole, GenericResourceApiVnfNetworkData vnfNetwork)
+            throws RestException {
         log.info("PUT | VNF Network Network Role ({})", vnfId);
-        if (!networkRole.equals(genericResourceApiVnfNetworkDataBodyParam.getNetworkRole())) {
+        if (!networkRole.equals(vnfNetwork.getNetworkRole())) {
             throw new RestProtocolException("bad-attribute", "network-role mismatch", HttpStatus.BAD_REQUEST.value());
         }
 
@@ -1693,7 +3865,7 @@ public class ConfigApiController implements ConfigApi {
 
         try {
             vnf = serviceDataHelper.getVnf(serviceInstanceId, vnfId);
-        } catch(JsonProcessingException e) {
+        } catch (JsonProcessingException e) {
 
             log.error("Could not parse service data", e);
             throw new RestApplicationException("data-conversion",
@@ -1717,27 +3889,29 @@ public class ConfigApiController implements ConfigApi {
             vnfTopology = new GenericResourceApiVnftopologyVnfTopology();
         }
 
-        GenericResourceApiVnfresourceassignmentsVnfResourceAssignments vnfResourceAssignments = vnfTopology.getVnfResourceAssignments();
+        GenericResourceApiVnfresourceassignmentsVnfResourceAssignments vnfResourceAssignments = vnfTopology
+                .getVnfResourceAssignments();
         if (vnfResourceAssignments == null) {
             vnfResourceAssignments = new GenericResourceApiVnfresourceassignmentsVnfResourceAssignments();
         }
 
-        GenericResourceApiVnfresourceassignmentsVnfresourceassignmentsVnfNetworks vnfNetworks = vnfResourceAssignments.getVnfNetworks();
+        GenericResourceApiVnfresourceassignmentsVnfresourceassignmentsVnfNetworks vnfNetworks = vnfResourceAssignments
+                .getVnfNetworks();
         if (vnfNetworks == null) {
             vnfNetworks = new GenericResourceApiVnfresourceassignmentsVnfresourceassignmentsVnfNetworks();
             vnfNetworks.setVnfNetwork(new ArrayList<>());
         }
 
-
         if (vnfNetworks.getVnfNetwork().isEmpty()) {
-            vnfNetworks.addVnfNetworkItem(genericResourceApiVnfNetworkDataBodyParam);
+            vnfNetworks.addVnfNetworkItem(vnfNetwork);
         } else {
             GenericResourceApiVnfresourceassignmentsVnfresourceassignmentsVnfNetworks vnfNetworksNew = new GenericResourceApiVnfresourceassignmentsVnfresourceassignmentsVnfNetworks();
             vnfNetworksNew.setVnfNetwork(new ArrayList<>());
             vnfNetworks.getVnfNetwork().stream()
-              .filter(targetNetwork -> !targetNetwork.getNetworkRole().equals(networkRole)).forEach(vnfNetworksNew::addVnfNetworkItem);
+                    .filter(targetNetwork -> !targetNetwork.getNetworkRole().equals(networkRole))
+                    .forEach(vnfNetworksNew::addVnfNetworkItem);
 
-            vnfNetworksNew.addVnfNetworkItem(genericResourceApiVnfNetworkDataBodyParam);
+            vnfNetworksNew.addVnfNetworkItem(vnfNetwork);
             vnfNetworks = vnfNetworksNew;
         }
 
@@ -1747,7 +3921,7 @@ public class ConfigApiController implements ConfigApi {
         vnf.setVnfData(vnfData);
         try {
             serviceDataHelper.saveVnf(serviceInstanceId, vnf, transaction);
-            transaction.commit();        
+            transaction.commit();
             return new ResponseEntity<>(responseStatus);
         } catch (JsonProcessingException e) {
             log.error("Error mapping object to JSON", e);
@@ -1756,7 +3930,6 @@ public class ConfigApiController implements ConfigApi {
         }
     }
 
-
     @Override
     public ResponseEntity<GenericResourceApiServicetopologyServiceTopology> configGENERICRESOURCEAPIservicesServiceServiceInstanceIdServiceDataServiceTopologyGet(
             String serviceInstanceId) throws RestApplicationException, RestProtocolException {
@@ -1771,7 +3944,7 @@ public class ConfigApiController implements ConfigApi {
         ConfigServices service = services.get(0);
 
         try {
-            if ( (service.getSvcData() == null) || service.getSvcData().isEmpty()) {
+            if ((service.getSvcData() == null) || service.getSvcData().isEmpty()) {
                 throw new RestProtocolException("data-missing", "No service-data entry found",
                         HttpStatus.NOT_FOUND.value());
             } else {
@@ -1793,25 +3966,26 @@ public class ConfigApiController implements ConfigApi {
     }
 
     /**
-     * Extracts VF MODULE data from CONFIG_GRA_SERVICES for a given, service-instance-id, vnf-id, and vf-module-id
+     * Extracts VF MODULE data from CONFIG_GRA_SERVICES for a given,
+     * service-instance-id, vnf-id, and vf-module-id
      * <p>
-     * Maps to /config/GENERIC-RESOURCE-API:services/service/{service-instance-id}/service-data/vnfs/vnf/{vnf-id}/vnf-data/vf-modules/vf-module/{vf-module-id}/
+     * Maps to
+     * /config/GENERIC-RESOURCE-API:services/service/{service-instance-id}/service-data/vnfs/vnf/{vnf-id}/vnf-data/vf-modules/vf-module/{vf-module-id}/
+     * 
      * @param serviceInstanceId the Service Instance ID to lookup data for
-     * @param vnfId the VNF ID of the VNF to return
-     * @param vfModuleId the vf-moudle ID of a specific VNF to return
+     * @param vnfId             the VNF ID of the VNF to return
+     * @param vfModuleId        the vf-moudle ID of a specific VNF to return
      * @return HttpStatus.OK (200) if the data is found.
      * @throws RestException if the data does not exist.
      */
     @Override
-    public ResponseEntity<GenericResourceApiServicedataServicedataVnfsVnfVnfdataVfmodulesVfModule>
-    configGENERICRESOURCEAPIservicesServiceServiceInstanceIdServiceDataVnfsVnfVnfIdVnfDataVfModulesVfModuleVfModuleIdGet(
+    public ResponseEntity<GenericResourceApiServicedataServicedataVnfsVnfVnfdataVfmodulesVfModule> configGENERICRESOURCEAPIservicesServiceServiceInstanceIdServiceDataVnfsVnfVnfIdVnfDataVfModulesVfModuleVfModuleIdGet(
             String serviceInstanceId, String vnfId, String vfModuleId) throws RestException {
 
         log.info("GET | Vf Module Data for ({})", vfModuleId);
 
-
         List<ConfigServices> services = configServicesRepository.findBySvcInstanceId(serviceInstanceId);
-        if((services == null) || (services.isEmpty())) {
+        if ((services == null) || (services.isEmpty())) {
             throw new RestProtocolException("data-missing", "No service entry found", HttpStatus.NOT_FOUND.value());
         }
 
@@ -1825,7 +3999,7 @@ public class ConfigApiController implements ConfigApi {
                     HttpStatus.INTERNAL_SERVER_ERROR.value());
         }
 
-        if(vfModule != null) {
+        if (vfModule != null) {
             return new ResponseEntity<>(vfModule, HttpStatus.OK);
         } else {
             log.info("No vf-module found for [{}]", vfModuleId);
@@ -1836,12 +4010,17 @@ public class ConfigApiController implements ConfigApi {
     }
 
     /**
-     * PUT VF MODULE data into CONFIG_GRA_SERVICES of a given, service-instance-id, vnf-id
+     * PUT VF MODULE data into CONFIG_GRA_SERVICES of a given, service-instance-id,
+     * vnf-id
      * <p>
-     * Maps to /config/GENERIC-RESOURCE-API:services/service/{service-instance-id}/service-data/vnfs/vnf/{vnf-id}/vnf-data/vf-modules/vf-module/{vf-module-id}/
+     * Maps to
+     * /config/GENERIC-RESOURCE-API:services/service/{service-instance-id}/service-data/vnfs/vnf/{vnf-id}/vnf-data/vf-modules/vf-module/{vf-module-id}/
+     * 
      * @param serviceInstanceId the Service Instance ID
-     * @param vnfId the VNF ID as the parent of the specified vf-module-id and child of the specified service-instance
-     * @param vfModuleId the vf-moudle ID as a child of the specified VNF
+     * @param vnfId             the VNF ID as the parent of the specified
+     *                          vf-module-id and child of the specified
+     *                          service-instance
+     * @param vfModuleId        the vf-module ID as a child of the specified VNF
      * @return HttpStatus.OK (200) if the data is found.
      * @throws RestException if the data does not exist.
      */
@@ -1852,19 +4031,18 @@ public class ConfigApiController implements ConfigApi {
             throws RestException {
         log.info("PUT | vf-module Data of ({}) for vnf ({}) in service({})", vfModuleId, vnfId, serviceInstanceId);
 
-        if(! vfModuleId.equals(genericResourceApiServicedataServicedataVnfsVnfVnfdataVfmodulesVfModuleBodyParam.getVfModuleId())) {
+        if (!vfModuleId.equals(
+                genericResourceApiServicedataServicedataVnfsVnfVnfdataVfmodulesVfModuleBodyParam.getVfModuleId())) {
             throw new RestProtocolException("bad-attribute", "vf-module-id mismatch", HttpStatus.BAD_REQUEST.value());
         }
 
-
         HttpStatus responseStatus = HttpStatus.NO_CONTENT;
         List<ConfigServices> services = configServicesRepository.findBySvcInstanceId(serviceInstanceId);
 
-        if((services == null) || (services.isEmpty())) {
+        if ((services == null) || (services.isEmpty())) {
             log.error("service-instance-id ({}) not found in SDN.", serviceInstanceId);
             return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
-        } 
-
+        }
 
         GenericResourceApiServicedataServicedataVnfsVnf vnf;
         try {
@@ -1876,13 +4054,14 @@ public class ConfigApiController implements ConfigApi {
                     HttpStatus.INTERNAL_SERVER_ERROR.value());
         }
 
-        if(vnf == null) {
+        if (vnf == null) {
             log.error("vnf-id ({}) not found in SDN.", vnfId);
             return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
         }
 
         // See if this is the first vf module being added
-        List<ConfigVfModules> configVfModules = configVfModulesRepository.findBySvcInstanceIdAndVnfId(serviceInstanceId, vnfId);
+        List<ConfigVfModules> configVfModules = configVfModulesRepository.findBySvcInstanceIdAndVnfId(serviceInstanceId,
+                vnfId);
 
         if ((configVfModules == null) || configVfModules.isEmpty()) {
             responseStatus = HttpStatus.CREATED;
@@ -1890,9 +4069,10 @@ public class ConfigApiController implements ConfigApi {
 
         // Add vf module
         try {
-            serviceDataHelper.saveVfModule(serviceInstanceId, vnfId, genericResourceApiServicedataServicedataVnfsVnfVnfdataVfmodulesVfModuleBodyParam, null);
+            serviceDataHelper.saveVfModule(serviceInstanceId, vnfId,
+                    genericResourceApiServicedataServicedataVnfsVnfVnfdataVfmodulesVfModuleBodyParam, null);
             return new ResponseEntity<>(responseStatus);
-        } catch(JsonProcessingException e) {
+        } catch (JsonProcessingException e) {
             log.error("Error mapping object to JSON", e);
             // Should probably be a 500 INTERNAL_SERVICE_ERROR
             return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
@@ -1903,21 +4083,23 @@ public class ConfigApiController implements ConfigApi {
      * Extracts VF MODULE Topology data from the Config table specified Service
      * Instance and VNF ID.
      * <p>
-     * Maps to /config/GENERIC-RESOURCE-API:services/service/{service-instance-id}/service-data/vnfs/vnf/{vnf-id}/vnf-data/vf-modules/vf-module/{vf-module-id}/vf-module-data/vf-module-topology/
+     * Maps to
+     * /config/GENERIC-RESOURCE-API:services/service/{service-instance-id}/service-data/vnfs/vnf/{vnf-id}/vnf-data/vf-modules/vf-module/{vf-module-id}/vf-module-data/vf-module-topology/
+     * 
      * @param serviceInstanceId the Service Instance ID to lookup data for
-     * @param vnfId the VNF ID of the VNF to extract topology data from.
-     * @param vfModuleId the vf-module-idof the vf-module to extract topology data from.
+     * @param vnfId             the VNF ID of the VNF to extract topology data from.
+     * @param vfModuleId        the vf-module-idof the vf-module to extract topology
+     *                          data from.
      * @return HttpStatus.OK (200) if the data is found.
      * @throws RestException if the data does not exist.
      */
     @Override
-    public ResponseEntity<GenericResourceApiVfmoduletopologyVfModuleTopology>
-    configGENERICRESOURCEAPIservicesServiceServiceInstanceIdServiceDataVnfsVnfVnfIdVnfDataVfModulesVfModuleVfModuleIdVfModuleDataVfModuleTopologyGet(
+    public ResponseEntity<GenericResourceApiVfmoduletopologyVfModuleTopology> configGENERICRESOURCEAPIservicesServiceServiceInstanceIdServiceDataVnfsVnfVnfIdVnfDataVfModulesVfModuleVfModuleIdVfModuleDataVfModuleTopologyGet(
             String serviceInstanceId, String vnfId, String vfModuleId) throws RestException {
         log.info("GET | vf-module-topology for ({})", vfModuleId);
 
         List<ConfigServices> services = configServicesRepository.findBySvcInstanceId(serviceInstanceId);
-        if((services == null) || (services.isEmpty())) {
+        if ((services == null) || (services.isEmpty())) {
             throw new RestApplicationException("data-missing",
                     "Request could not be completed because the relevant data model content does not exist",
                     HttpStatus.NOT_FOUND.value());
@@ -1932,8 +4114,7 @@ public class ConfigApiController implements ConfigApi {
                     "Request could not be completed due to internal error", e,
                     HttpStatus.INTERNAL_SERVER_ERROR.value());
         }
-        if (vfModule != null
-                && vfModule.getVfModuleData() != null
+        if (vfModule != null && vfModule.getVfModuleData() != null
                 && vfModule.getVfModuleData().getVfModuleTopology() != null) {
             return new ResponseEntity<>(vfModule.getVfModuleData().getVfModuleTopology(), HttpStatus.OK);
         } else {
@@ -1950,20 +4131,15 @@ public class ConfigApiController implements ConfigApi {
 
         log.info("DELETE | vf-module Data for ({})", vfModuleId);
 
-
         List<ConfigServices> services = configServicesRepository.findBySvcInstanceId(serviceInstanceId);
 
-        if((services == null) || (services.isEmpty())) {
+        if ((services == null) || (services.isEmpty())) {
             log.error("service-instance-id ({}) not found in SDN.", serviceInstanceId);
             return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
-        } 
-
-
+        }
 
         serviceDataHelper.deleteVfModule(serviceInstanceId, vnfId, vfModuleId);
         return new ResponseEntity<>(HttpStatus.OK);
-        
+
     }
 }
-
index 707c04a..9651345 100644 (file)
@@ -101,13 +101,17 @@ import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
 import org.springframework.stereotype.Controller;
 
+import liquibase.pro.license.keymgr.e;
+import liquibase.pro.packaged.E;
+
 @Controller
 @ComponentScan(basePackages = { "org.onap.sdnc.apps.ms.gra.*", "org.onap.ccsdk.apps.services" })
 @EntityScan("org.onap.sdnc.apps.ms.gra.*")
 @Import(value = SvcLogicFactory.class)
 public class OperationsApiController implements OperationsApi {
 
-    private static final String CALLED_STR = "{} called.";
+    private static final String CALLED_STR = "GRA START: {} called.";
+    private static final String RETURNED_STR = "GRA END: Returned {} for {} [{}] {}.";
     private static final String MODULE_NAME = "GENERIC-RESOURCE-API";
     private static final String SERVICE_OBJECT_PATH_PARAM = "service-object-path";
     private static final String NETWORK_OBJECT_PATH_PARAM = "network-object-path";
@@ -216,6 +220,7 @@ public class OperationsApiController implements OperationsApi {
 
             retval.setOutput(resp);
 
+            log.info(RETURNED_STR, resp.getResponseCode(), svcOperation, "unknown-id:network", resp.getResponseMessage());
             return new ResponseEntity<>(retval, HttpStatus.FORBIDDEN);
         }
 
@@ -233,11 +238,12 @@ public class OperationsApiController implements OperationsApi {
         try {
             ctxIn.mergeJson(svcOperation + "-input", objectMapper.writeValueAsString(graInput.getInput()));
         } catch (JsonProcessingException e) {
-            log.error("exiting {} due to parse error on input preload data", svcOperation);
+            log.error("exiting {} due to parse error on input preload data", svcOperation, e);
             resp.setResponseCode("500");
             resp.setResponseMessage("internal error");
             resp.setAckFinalIndicator("Y");
             retval.setOutput(resp);
+            log.info(RETURNED_STR, resp.getResponseCode(), svcOperation, preloadId+":network", resp.getResponseMessage());
             return new ResponseEntity<>(retval, HttpStatus.INTERNAL_SERVER_ERROR);
         }
 
@@ -246,11 +252,12 @@ public class OperationsApiController implements OperationsApi {
             preloadData = getConfigPreloadData(preloadId, preloadType);
             ctxIn.mergeJson("preload-data", objectMapper.writeValueAsString(preloadData));
         } catch (JsonProcessingException e) {
-            log.error("exiting {} due to parse error on saved config preload data", svcOperation);
+            log.error("exiting {} due to parse error on saved config preload data", svcOperation, e);
             resp.setResponseCode("500");
             resp.setResponseMessage("internal error");
             resp.setAckFinalIndicator("Y");
             retval.setOutput(resp);
+            log.info(RETURNED_STR, resp.getResponseCode(), svcOperation, preloadId+":network", resp.getResponseMessage());
             return new ResponseEntity<>(retval, HttpStatus.INTERNAL_SERVER_ERROR);
         }
 
@@ -295,7 +302,7 @@ public class OperationsApiController implements OperationsApi {
             resp.setResponseCode("500");
             resp.setResponseMessage(e.getMessage());
         }
-
+        log.info(RETURNED_STR, resp.getResponseCode(), svcOperation, preloadId+":network", resp.getResponseMessage());
         retval.setOutput(resp);
         return (new ResponseEntity<>(retval, HttpStatus.valueOf(Integer.parseInt(resp.getResponseCode()))));
     }
@@ -317,6 +324,7 @@ public class OperationsApiController implements OperationsApi {
 
             retval.setOutput(resp);
 
+            log.info(RETURNED_STR, resp.getResponseCode(), svcOperation, "unknown-id:vf-module", resp.getResponseMessage());
             return new ResponseEntity<>(retval, HttpStatus.FORBIDDEN);
         }
 
@@ -334,11 +342,12 @@ public class OperationsApiController implements OperationsApi {
         try {
             ctxIn.mergeJson(svcOperation + "-input", objectMapper.writeValueAsString(graInput.getInput()));
         } catch (JsonProcessingException e) {
-            log.error("exiting {} due to parse error on input preload data", svcOperation);
+            log.error("exiting {} due to parse error on input preload data", svcOperation, e);
             resp.setResponseCode("500");
             resp.setResponseMessage("internal error");
             resp.setAckFinalIndicator("Y");
             retval.setOutput(resp);
+            log.info(RETURNED_STR, resp.getResponseCode(), svcOperation, preloadId+":network", resp.getResponseMessage());
             return new ResponseEntity<>(retval, HttpStatus.INTERNAL_SERVER_ERROR);
         }
 
@@ -347,11 +356,12 @@ public class OperationsApiController implements OperationsApi {
             preloadData = getConfigPreloadData(preloadId, preloadType);
             ctxIn.mergeJson("preload-data", objectMapper.writeValueAsString(preloadData));
         } catch (JsonProcessingException e) {
-            log.error("exiting {} due to parse error on saved config preload data", svcOperation);
+            log.error("exiting {} due to parse error on saved config preload data", svcOperation, e);
             resp.setResponseCode("500");
             resp.setResponseMessage("internal error");
             resp.setAckFinalIndicator("Y");
             retval.setOutput(resp);
+            log.info(RETURNED_STR, resp.getResponseCode(), svcOperation, preloadId+":network", resp.getResponseMessage());
             return new ResponseEntity<>(retval, HttpStatus.INTERNAL_SERVER_ERROR);
         }
 
@@ -378,20 +388,25 @@ public class OperationsApiController implements OperationsApi {
             resp.setAckFinalIndicator("true");
             resp.setResponseCode("500");
             resp.setResponseMessage("Check that you populated module, rpc and or mode correctly.");
+            log.error("Caught NullPointerException", npe);
         } catch (SvcLogicException e) {
             resp.setAckFinalIndicator("true");
             resp.setResponseCode("500");
             resp.setResponseMessage(e.getMessage());
+            log.error("Caught SvcLogicException", e);
         } catch (JsonMappingException e) {
             resp.setAckFinalIndicator("true");
             resp.setResponseCode("500");
             resp.setResponseMessage(e.getMessage());
+            log.error("Caught JsonMappingException", e);
         } catch (JsonProcessingException e) {
             resp.setAckFinalIndicator("true");
             resp.setResponseCode("500");
             resp.setResponseMessage(e.getMessage());
+            log.error("Caught JsonProcessingException", e);
         }
 
+        log.info(RETURNED_STR, resp.getResponseCode(), svcOperation, preloadId+":vf-module", resp.getResponseMessage());
         retval.setOutput(resp);
         return (new ResponseEntity<>(retval, HttpStatus.valueOf(Integer.parseInt(resp.getResponseCode()))));
     }
@@ -508,6 +523,7 @@ public class OperationsApiController implements OperationsApi {
 
             retval.setOutput(resp);
 
+            log.info(RETURNED_STR, resp.getResponseCode(), svcOperation, "unknown-id", resp.getResponseMessage());
             return new ResponseEntity<>(retval, HttpStatus.OK);
         }
 
@@ -519,11 +535,12 @@ public class OperationsApiController implements OperationsApi {
         try {
             ctxIn.mergeJson(svcOperation + "-input", objectMapper.writeValueAsString(input.getInput()));
         } catch (JsonProcessingException e) {
-            log.error("exiting {} due to parse error on input data", svcOperation);
+            log.error("exiting {} due to parse error on input data", svcOperation, e);
             resp.setResponseCode("500");
             resp.setResponseMessage("internal error");
             resp.setAckFinalIndicator("Y");
             retval.setOutput(resp);
+            log.info(RETURNED_STR, resp.getResponseCode(), svcOperation, svcInstanceId, resp.getResponseMessage());
             return new ResponseEntity<>(retval, HttpStatus.INTERNAL_SERVER_ERROR);
         }
 
@@ -536,11 +553,12 @@ public class OperationsApiController implements OperationsApi {
             try {
                 svcData = serviceDataHelper.getServiceDataAsString(svcInstanceId);
             } catch (JsonProcessingException e) {
-                log.error("exiting {} due to parse error on service data", svcOperation);
+                log.error("exiting {} due to parse error on service data", svcOperation, e);
                 resp.setResponseCode("500");
                 resp.setResponseMessage("internal error");
                 resp.setAckFinalIndicator("Y");
                 retval.setOutput(resp);
+                log.info(RETURNED_STR, resp.getResponseCode(), svcOperation, svcInstanceId, resp.getResponseMessage());
                 return new ResponseEntity<>(retval, HttpStatus.INTERNAL_SERVER_ERROR);
             }
         }
@@ -555,6 +573,7 @@ public class OperationsApiController implements OperationsApi {
 
             retval.setOutput(resp);
 
+            log.info(RETURNED_STR, resp.getResponseCode(), svcOperation, svcInstanceId, resp.getResponseMessage());
             return new ResponseEntity<>(retval, HttpStatus.OK);
         }
 
@@ -616,10 +635,12 @@ public class OperationsApiController implements OperationsApi {
             resp.setAckFinalIndicator("true");
             resp.setResponseCode("500");
             resp.setResponseMessage("Check that you populated module, rpc and or mode correctly.");
+            log.error("Caught NullPointerException", npe);
         } catch (SvcLogicException e) {
             resp.setAckFinalIndicator("true");
             resp.setResponseCode("500");
             resp.setResponseMessage(e.getMessage());
+            log.error("Caught SvcLogicException", e);
         }
 
         // Update status in config services entry
@@ -634,11 +655,12 @@ public class OperationsApiController implements OperationsApi {
         try {
             serviceDataHelper.saveService(configService, ctxSvcDataJson);
         } catch (JsonProcessingException e) {
-            log.error("exiting {} due to  error saving service data", svcOperation);
+            log.error("exiting {} due to  error saving service data", svcOperation, e);
             resp.setResponseCode("500");
             resp.setResponseMessage("internal error");
             resp.setAckFinalIndicator("Y");
             retval.setOutput(resp);
+            log.info(RETURNED_STR, resp.getResponseCode(), svcOperation, svcInstanceId, resp.getResponseMessage());
             return new ResponseEntity<>(retval, HttpStatus.INTERNAL_SERVER_ERROR);
         }
 
@@ -649,6 +671,7 @@ public class OperationsApiController implements OperationsApi {
         }
         retval.setOutput(resp);
         
+        log.info(RETURNED_STR, resp.getResponseCode(), svcOperation, svcInstanceId, resp.getResponseMessage());
         return (new ResponseEntity<>(retval, HttpStatus.OK));
     }
 
@@ -671,6 +694,7 @@ public class OperationsApiController implements OperationsApi {
 
             retval.setOutput(resp);
 
+            log.info(RETURNED_STR, resp.getResponseCode(), svcOperation, "unknown-id", resp.getResponseMessage());
             return new ResponseEntity<>(retval, HttpStatus.OK);
         }
 
@@ -682,11 +706,12 @@ public class OperationsApiController implements OperationsApi {
         try {
             ctxIn.mergeJson(svcOperation + "-input", objectMapper.writeValueAsString(input.getInput()));
         } catch (JsonProcessingException e) {
-            log.error("exiting {} due to parse error on input data", svcOperation);
+            log.error("exiting {} due to parse error on input data", svcOperation, e);
             resp.setResponseCode("500");
             resp.setResponseMessage("internal error");
             resp.setAckFinalIndicator("Y");
             retval.setOutput(resp);
+            log.info(RETURNED_STR, resp.getResponseCode(), svcOperation, svcInstanceId, resp.getResponseMessage());
             return new ResponseEntity<>(retval, HttpStatus.INTERNAL_SERVER_ERROR);
         }
 
@@ -707,6 +732,7 @@ public class OperationsApiController implements OperationsApi {
                 resp.setResponseMessage("internal error");
                 resp.setAckFinalIndicator("Y");
                 retval.setOutput(resp);
+                log.info(RETURNED_STR, resp.getResponseCode(), svcOperation, svcInstanceId, resp.getResponseMessage());
                 return new ResponseEntity<>(retval, HttpStatus.INTERNAL_SERVER_ERROR);
             }
         } else {
@@ -764,10 +790,12 @@ public class OperationsApiController implements OperationsApi {
             resp.setAckFinalIndicator("true");
             resp.setResponseCode("500");
             resp.setResponseMessage("Check that you populated module, rpc and or mode correctly.");
+            log.error("Caught NullPointerException", npe);
         } catch (SvcLogicException e) {
             resp.setAckFinalIndicator("true");
             resp.setResponseCode("500");
             resp.setResponseMessage(e.getMessage());
+            log.error("Caught SvcLogicException", e);
         }
 
         // Update status in config services entry
@@ -786,6 +814,7 @@ public class OperationsApiController implements OperationsApi {
             resp.setResponseMessage("internal error");
             resp.setAckFinalIndicator("Y");
             retval.setOutput(resp);
+            log.info(RETURNED_STR, resp.getResponseCode(), svcOperation, svcInstanceId, resp.getResponseMessage());
             return new ResponseEntity<>(retval, HttpStatus.INTERNAL_SERVER_ERROR);
         }
 
@@ -795,6 +824,7 @@ public class OperationsApiController implements OperationsApi {
             operationalServicesRepository.save(operService);
         }
         retval.setOutput(resp);
+        log.info(RETURNED_STR, resp.getResponseCode(), svcOperation, svcInstanceId, resp.getResponseMessage());
         return (new ResponseEntity<>(retval, HttpStatus.OK));
 
     }
@@ -818,6 +848,7 @@ public class OperationsApiController implements OperationsApi {
 
             retval.setOutput(resp);
 
+            log.info(RETURNED_STR, resp.getResponseCode(), svcOperation, "unknown-id", resp.getResponseMessage());
             return new ResponseEntity<>(retval, HttpStatus.OK);
         }
 
@@ -835,11 +866,12 @@ public class OperationsApiController implements OperationsApi {
             ctxIn.mergeJson(svcOperation + "-input", objectMapper.writeValueAsString(input.getInput()));
         }
         catch(JsonProcessingException e) {
-            log.error("exiting {} due to parse error on input data", svcOperation);
+            log.error("exiting {} due to parse error on input data", svcOperation, e);
             resp.setResponseCode("500");
             resp.setResponseMessage("internal error");
             resp.setAckFinalIndicator("Y");
             retval.setOutput(resp);
+            log.info(RETURNED_STR, resp.getResponseCode(), svcOperation, svcInstanceId, resp.getResponseMessage());
             return new ResponseEntity<>(retval, HttpStatus.INTERNAL_SERVER_ERROR);
         }
 
@@ -852,11 +884,12 @@ public class OperationsApiController implements OperationsApi {
            try {
                svcData = serviceDataHelper.getServiceDataAsString(svcInstanceId);
            } catch (JsonProcessingException e) {
-               log.error("exiting {} due to parse error on service data", svcOperation);
+               log.error("exiting {} due to parse error on service data", svcOperation, e);
                resp.setResponseCode("500");
                resp.setResponseMessage("internal error");
                resp.setAckFinalIndicator("Y");
                retval.setOutput(resp);
+               log.info(RETURNED_STR, resp.getResponseCode(), svcOperation, svcInstanceId, resp.getResponseMessage());
                return new ResponseEntity<>(retval, HttpStatus.INTERNAL_SERVER_ERROR);
            }
        }
@@ -871,6 +904,7 @@ public class OperationsApiController implements OperationsApi {
 
            retval.setOutput(resp);
 
+           log.info(RETURNED_STR, resp.getResponseCode(), svcOperation, svcInstanceId, resp.getResponseMessage());
            return new ResponseEntity<>(retval, HttpStatus.OK);
        }
 
@@ -935,11 +969,13 @@ public class OperationsApiController implements OperationsApi {
             resp.setAckFinalIndicator("Y");
             resp.setResponseCode("500");
             resp.setResponseMessage("Check that you populated module, rpc and or mode correctly.");
+            log.info("Caught NullPointerException", npe);
         }
         catch(SvcLogicException e) {
             resp.setAckFinalIndicator("Y");
             resp.setResponseCode("500");
             resp.setResponseMessage(e.getMessage());
+            log.info("Caught SvcLogicException", e);
         }
 
         // Update status in config services entry
@@ -953,11 +989,12 @@ public class OperationsApiController implements OperationsApi {
         try {
             serviceDataHelper.saveService(configService, ctxSvcDataJson);
         } catch (JsonProcessingException e) {
-            log.error("exiting {} due to  error saving service data", svcOperation);
+            log.error("exiting {} due to  error saving service data", svcOperation, e);
             resp.setResponseCode("500");
             resp.setResponseMessage("internal error");
             resp.setAckFinalIndicator("Y");
             retval.setOutput(resp);
+            log.info(RETURNED_STR, resp.getResponseCode(), svcOperation, svcInstanceId+":"+vnfId, resp.getResponseMessage());
             return new ResponseEntity<>(retval, HttpStatus.INTERNAL_SERVER_ERROR);
         }
 
@@ -977,8 +1014,8 @@ public class OperationsApiController implements OperationsApi {
             new Thread(backgroundThread).start();
         }
 
-        log.info("Returned {} for {} [{}] {}.", resp.getResponseCode(), svcOperation, vnfId, resp.getResponseMessage());
         retval.setOutput(resp);
+        log.info(RETURNED_STR, resp.getResponseCode(), svcOperation, svcInstanceId+":"+vnfId, resp.getResponseMessage());
         return (new ResponseEntity<>(retval, HttpStatus.OK));
     }
 
@@ -997,7 +1034,7 @@ public class OperationsApiController implements OperationsApi {
         try {
             ctxIn.mergeJson(parentOperation + "-input", objectMapper.writeValueAsString(input.getInput()));
         } catch (JsonProcessingException e) {
-            log.error("exiting {} due to parse error on input data", svcOperation);
+            log.error("exiting {} due to parse error on input data", svcOperation, e);
             return;
         }
 
@@ -1085,7 +1122,7 @@ public class OperationsApiController implements OperationsApi {
                 try {
                     serviceDataHelper.saveService(configService, ctxSvcDataJson);
                 } catch (JsonProcessingException e) {
-                    log.error("exiting {} due to  error saving service data", svcOperation);
+                    log.error("exiting {} due to  error saving service data", svcOperation, e);
                     return;
                 }
 
@@ -1096,7 +1133,7 @@ public class OperationsApiController implements OperationsApi {
             }
         }
         catch(Exception e) {
-            log.error("Caught Exception updating configuration status in SDN for {} [{}] \n", svcOperation, vnfId);
+            log.error("Caught Exception updating configuration status in SDN for {} [{}] \n", svcOperation, vnfId, e);
         }
     }
 
@@ -1119,6 +1156,7 @@ public class OperationsApiController implements OperationsApi {
             resp.setResponseMessage("null or empty service-instance-id");
             resp.setAckFinalIndicator("Y");
             retval.setOutput(resp);
+            log.info(RETURNED_STR, resp.getResponseCode(), svcOperation, "unknown-id", resp.getResponseMessage());
             return new ResponseEntity<>(retval, HttpStatus.OK);
         }
 
@@ -1130,6 +1168,7 @@ public class OperationsApiController implements OperationsApi {
             resp.setResponseMessage("null or empty vnf-id");
             resp.setAckFinalIndicator("Y");
             retval.setOutput(resp);
+            log.info(RETURNED_STR, resp.getResponseCode(), svcOperation, "unknown-id", resp.getResponseMessage());
             return new ResponseEntity<>(retval, HttpStatus.OK);
         }
 
@@ -1143,11 +1182,12 @@ public class OperationsApiController implements OperationsApi {
         try {
             ctxIn.mergeJson(svcOperation + "-input", objectMapper.writeValueAsString(input.getInput()));
         } catch (JsonProcessingException e) {
-            log.error("exiting {} due to parse error on input data", svcOperation);
+            log.error("exiting {} due to parse error on input data", svcOperation, e);
             resp.setResponseCode("500");
             resp.setResponseMessage("internal error");
             resp.setAckFinalIndicator("Y");
             retval.setOutput(resp);
+            log.info(RETURNED_STR, resp.getResponseCode(), svcOperation, svcInstanceId+":"+vnfId+":"+vfModuleId, resp.getResponseMessage());
             return new ResponseEntity<>(retval, HttpStatus.INTERNAL_SERVER_ERROR);
         }
 
@@ -1160,11 +1200,12 @@ public class OperationsApiController implements OperationsApi {
             try {
                 svcData = serviceDataHelper.getServiceDataAsString(svcInstanceId);
             } catch (JsonProcessingException e) {
-                log.error("exiting {} due to parse error on service data", svcOperation);
+                log.error("exiting {} due to parse error on service data", svcOperation, e);
                 resp.setResponseCode("500");
                 resp.setResponseMessage("internal error");
                 resp.setAckFinalIndicator("Y");
                 retval.setOutput(resp);
+                log.info(RETURNED_STR, resp.getResponseCode(), svcOperation, svcInstanceId+":"+vnfId+":"+vfModuleId, resp.getResponseMessage());
                 return new ResponseEntity<>(retval, HttpStatus.INTERNAL_SERVER_ERROR);
             }
         }
@@ -1179,6 +1220,7 @@ public class OperationsApiController implements OperationsApi {
  
             retval.setOutput(resp);
  
+            log.info(RETURNED_STR, resp.getResponseCode(), svcOperation, svcInstanceId+":"+vnfId+":"+vfModuleId, resp.getResponseMessage());
             return new ResponseEntity<>(retval, HttpStatus.OK);
         }
 
@@ -1189,10 +1231,10 @@ public class OperationsApiController implements OperationsApi {
         if (operServices != null && !operServices.isEmpty()) {
             operService = operServices.get(0);
             log.info("Read ({}) data for [{}] operational-data: {}",
-                    "OPERATIONAL_GRA_PORT_MIRROR_CONFIGURATIONS", svcInstanceId, operService.getSvcData().toString());
+                    "OPERATIONAL_GRA_SERVICES", svcInstanceId, operService.getSvcData().toString());
             //ctxIn.mergeJson("operational-data", operService.getSvcData());
         } else {
-            log.info("No operational-data found in OPERATIONAL_GRA_PORT_MIRROR_CONFIGURATIONS for [{}]", svcInstanceId);
+            log.info("No operational-data found in OPERATIONAL_GRA_SERVICES for [{}]", svcInstanceId);
             operService = new OperationalServices(svcInstanceId, null, null);
         }
 
@@ -1264,12 +1306,15 @@ public class OperationsApiController implements OperationsApi {
             resp.setAckFinalIndicator("Y");
             resp.setResponseCode("500");
             resp.setResponseMessage("Check that you populated module, rpc and or mode correctly.");
+            log.error("exiting {} due to error updating service data", svcOperation, npe);
         } catch (SvcLogicException e) {
             resp.setAckFinalIndicator("Y");
+            log.error("exiting {} due to error updating service data", svcOperation, e);
         } catch (JsonProcessingException e) {
             resp.setAckFinalIndicator("Y");
             resp.setResponseCode("500");
             resp.setResponseMessage("Internal error");
+            log.info(RETURNED_STR, resp.getResponseCode(), svcOperation, svcInstanceId+":"+vnfId+":"+vfModuleId, resp.getResponseMessage());
             log.error("exiting {} due to error updating service data", svcOperation, e);
         }
 
@@ -1284,6 +1329,7 @@ public class OperationsApiController implements OperationsApi {
             new Thread(backgroundThread).start();
         }
         retval.setOutput(resp);
+        log.info(RETURNED_STR, resp.getResponseCode(), svcOperation, svcInstanceId+":"+vnfId+":"+vfModuleId, resp.getResponseMessage());
         return (new ResponseEntity<>(retval, HttpStatus.OK));
     }
 
@@ -1300,7 +1346,7 @@ public class OperationsApiController implements OperationsApi {
         try {
             ctxIn.mergeJson(parentOperation + "-input", objectMapper.writeValueAsString(input.getInput()));
         } catch (JsonProcessingException e) {
-            log.error("exiting {} due to parse error on input data", svcOperation);
+            log.error("exiting {} due to parse error on input data", svcOperation, e);
             return;
         }
 
@@ -1313,7 +1359,7 @@ public class OperationsApiController implements OperationsApi {
             try {
                 svcData = serviceDataHelper.getServiceDataAsString(svcInstanceId);
             } catch (JsonProcessingException e) {
-                log.error("exiting {} due to parse error on service data", svcOperation);
+                log.error("exiting {} due to parse error on service data", svcOperation, e);
                 return;
             }
         }
@@ -1332,10 +1378,10 @@ public class OperationsApiController implements OperationsApi {
         if (operServices != null && !operServices.isEmpty()) {
             operService = operServices.get(0);
             log.info("Read ({}) data for [{}] operational-data: {}",
-                    "OPERATIONAL_GRA_PORT_MIRROR_CONFIGURATIONS", svcInstanceId, operService.getSvcData().toString());
+                    "OPERATIONAL_GRA_SERVICES", svcInstanceId, operService.getSvcData().toString());
             //ctxIn.mergeJson("operational-data", operService.getSvcData());
         } else {
-            log.info("No operational-data found in OPERATIONAL_GRA_PORT_MIRROR_CONFIGURATIONS for [{}]", svcInstanceId);
+            log.info("No operational-data found in OPERATIONAL_GRA_SERVICES for [{}]", svcInstanceId);
             operService = new OperationalServices(svcInstanceId, null, null);
         }
 
@@ -1381,7 +1427,7 @@ public class OperationsApiController implements OperationsApi {
             try {
                 serviceDataHelper.saveService(configService, ctxSvcDataJson);
             } catch (JsonProcessingException e) {
-                log.error("exiting {} due to  error saving service data", svcOperation);
+                log.error("exiting {} due to  error saving service data", svcOperation, e);
                 return;
             }
 
@@ -1390,7 +1436,7 @@ public class OperationsApiController implements OperationsApi {
             operationalServicesRepository.save(operService);
 
         } catch (Exception ex) {
-            log.error("Caught Exception updating service status in SDN for {} [{}] \n", svcOperation, svcInstanceId);
+            log.error("Caught Exception updating service status in SDN for {} [{}] \n", svcOperation, svcInstanceId, ex);
         }
         log.info("Returned {} for {} [{}] {}.", respStatus, svcOperation, svcInstanceId, errorMessage);
     }
@@ -1413,6 +1459,7 @@ public class OperationsApiController implements OperationsApi {
             resp.setResponseMessage("null or empty configuration-id");
             resp.setAckFinalIndicator("Y");
             retval.setOutput(resp);
+            log.info(RETURNED_STR, resp.getResponseCode(), svcOperation, "unknown-id", resp.getResponseMessage());
             return new ResponseEntity<>(retval, HttpStatus.OK);
         }
 
@@ -1424,6 +1471,7 @@ public class OperationsApiController implements OperationsApi {
             resp.setResponseMessage("null or empty service-instance-id");
             resp.setAckFinalIndicator("Y");
             retval.setOutput(resp);
+            log.info(RETURNED_STR, resp.getResponseCode(), svcOperation, "unknown-id", resp.getResponseMessage());
             return new ResponseEntity<>(retval, HttpStatus.OK);
         }
 
@@ -1436,11 +1484,12 @@ public class OperationsApiController implements OperationsApi {
         try {
             ctxIn.mergeJson(svcOperation + "-input", objectMapper.writeValueAsString(input.getInput()));
         } catch (JsonProcessingException e) {
-            log.error("exiting {} due to parse error on input data", svcOperation);
+            log.error("exiting {} due to parse error on input data", svcOperation, e);
             resp.setResponseCode("500");
             resp.setResponseMessage("internal error");
             resp.setAckFinalIndicator("Y");
             retval.setOutput(resp);
+            log.info(RETURNED_STR, resp.getResponseCode(), svcOperation, svcInstanceId+":"+configurationId, resp.getResponseMessage());
             return new ResponseEntity<>(retval, HttpStatus.INTERNAL_SERVER_ERROR);
         }
 
@@ -1459,6 +1508,7 @@ public class OperationsApiController implements OperationsApi {
             resp.setAckFinalIndicator("Y");
 
             retval.setOutput(resp);
+            log.info(RETURNED_STR, resp.getResponseCode(), svcOperation, svcInstanceId+":"+configurationId, resp.getResponseMessage());
             return new ResponseEntity<>(retval, HttpStatus.OK);
         }
 
@@ -1563,8 +1613,10 @@ public class OperationsApiController implements OperationsApi {
             resp.setAckFinalIndicator("Y");
             resp.setResponseCode("500");
             resp.setResponseMessage("Check that you populated module, rpc and or mode correctly.");
+            log.error("Caught NullPointerException", npe);
         } catch (SvcLogicException e) {
             resp.setAckFinalIndicator("Y");
+            log.error("Caught SvcLogicException", e);
         }
 
         if (ackFinal.equals("N")) {
@@ -1577,7 +1629,8 @@ public class OperationsApiController implements OperationsApi {
             };
             new Thread(backgroundThread).start();
         }
-        log.info("Returned {} for {} [{}] {}.", respStatus, svcOperation, configurationId, errorMessage);
+
+        log.info(RETURNED_STR, resp.getResponseCode(), svcOperation, svcInstanceId+":"+configurationId, resp.getResponseMessage());
         return (new ResponseEntity<>(retval, HttpStatus.OK));
     }
 
@@ -1597,7 +1650,7 @@ public class OperationsApiController implements OperationsApi {
         try {
             ctxIn.mergeJson(parentOperation + "-input", objectMapper.writeValueAsString(input.getInput()));
         } catch (JsonProcessingException e) {
-            log.error("exiting {} due to parse error on input data", svcOperation);
+            log.error("exiting {} due to parse error on input data", svcOperation, e);
             return;
         }
 
@@ -1675,7 +1728,7 @@ public class OperationsApiController implements OperationsApi {
             //operationalPortMirrorConfigurationsRepository.save(operPortMirrorConfiguration);
 
         } catch (Exception e) {
-            log.error("Caught Exception updating configuration status in SDN for {} [{}] \n", svcOperation, configurationId);
+            log.error("Caught Exception updating configuration status in SDN for {} [{}] \n", svcOperation, configurationId, e);
         }
         log.info("Returned SUCCESS for {} [{}]", svcOperation, configurationId);
     }
@@ -1701,7 +1754,7 @@ public class OperationsApiController implements OperationsApi {
         try {
             ctxIn.mergeJson(svcOperation + "-input", objectMapper.writeValueAsString(input.getInput()));
         } catch (JsonProcessingException e) {
-            log.error("exiting {} due to parse error on input data", svcOperation);
+            log.error("exiting {} due to parse error on input data", svcOperation, e);
             return new ResponseEntity<>(retval, HttpStatus.INTERNAL_SERVER_ERROR);
         }
 
@@ -1735,6 +1788,7 @@ public class OperationsApiController implements OperationsApi {
             retval.setOutput(vnfgetresourcerequestOutput);
 
         } catch (Exception e) {
+            log.error("Caught exception", e);
             return (new ResponseEntity<>(retval, HttpStatus.INTERNAL_SERVER_ERROR));
         }
         return (new ResponseEntity<>(retval, HttpStatus.OK));
@@ -1764,7 +1818,7 @@ public class OperationsApiController implements OperationsApi {
         try {
             ctxIn.mergeJson(svcOperation + "-input", objectMapper.writeValueAsString(input.getInput()));
         } catch (JsonProcessingException e) {
-            log.error("exiting {} due to parse error on input data", svcOperation);
+            log.error("exiting {} due to parse error on input data", svcOperation, e);
             resp.setErrorCode("500");
             resp.setErrorMsg("internal error");
             retval.setOutput(resp);
@@ -1789,9 +1843,11 @@ public class OperationsApiController implements OperationsApi {
         } catch (NullPointerException npe) {
             resp.setErrorCode("500");
             resp.setErrorMsg("Check that you populated module, rpc and or mode correctly.");
+            log.error("Caught NullPointerException", npe);
         } catch (SvcLogicException e) {
             resp.setErrorCode("500");
             resp.setErrorMsg(e.getMessage());
+            log.error("Caught SvcLogicException", e);
         }
 
         retval.setOutput(resp);
index f04a3ac..adcd504 100644 (file)
@@ -6,8 +6,10 @@ import java.util.LinkedList;
 import java.util.List;
 
 import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.DeserializationFeature;
 import com.fasterxml.jackson.databind.JsonMappingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.SerializationFeature;
 
 import org.onap.sdnc.apps.ms.gra.data.ConfigNetworks;
 import org.onap.sdnc.apps.ms.gra.data.ConfigNetworksRepository;
@@ -40,6 +42,8 @@ public class ServiceDataHelper {
     @Autowired
     private ObjectMapper objectMapper;
 
+    private ObjectMapper unwrappedObjectMapper = null;
+
     @Autowired
     private ConfigServicesRepository configServicesRepository;
     
@@ -56,6 +60,15 @@ public class ServiceDataHelper {
 
     }
 
+    private ObjectMapper getUnwrappedObjectMapper() {
+        if (unwrappedObjectMapper == null) {
+            unwrappedObjectMapper = objectMapper.copy();
+            unwrappedObjectMapper.configure(SerializationFeature.WRAP_ROOT_VALUE, false);
+            unwrappedObjectMapper.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, false);
+        }
+       return unwrappedObjectMapper;
+    }
+
     public class ServiceDataTransaction {
         private List<ConfigServices> servicesToSave = new LinkedList<ConfigServices>();
         private List<ConfigNetworks> networksToSave = new LinkedList<ConfigNetworks>();
@@ -168,7 +181,7 @@ public class ServiceDataHelper {
             vfModule.setVfModuleId(configVfModule.getVfModuleId());
             String vfModuleDataAsString = configVfModule.getVfModuleData();
             if (vfModuleDataAsString != null) {
-                vfModule.setVfModuleData(objectMapper.readValue(vfModuleDataAsString,
+                vfModule.setVfModuleData(getUnwrappedObjectMapper().readValue(vfModuleDataAsString,
                         GenericResourceApiServicedataServicedataVnfsVnfVnfdataVfmodulesVfmoduleVfModuleData.class));
             }
 
@@ -186,7 +199,7 @@ public class ServiceDataHelper {
                 vfModule.setVfModuleId(configVfModule.getVfModuleId());
                 String vfModuleDataAsString = configVfModule.getVfModuleData();
                 if (vfModuleDataAsString != null) {
-                    vfModule.setVfModuleData(objectMapper.readValue(vfModuleDataAsString, GenericResourceApiServicedataServicedataVnfsVnfVnfdataVfmodulesVfmoduleVfModuleData.class));
+                    vfModule.setVfModuleData(getUnwrappedObjectMapper().readValue(vfModuleDataAsString, GenericResourceApiServicedataServicedataVnfsVnfVnfdataVfmodulesVfmoduleVfModuleData.class));
                 }
                 vfModules.addVfModuleItem(vfModule);
             }
@@ -204,7 +217,7 @@ public class ServiceDataHelper {
             GenericResourceApiServicedataServicedataVnfsVnfVnfData vnfDataAsObject = null;
             String vnfDataAsString = configVnf.getVnfData();
             if (vnfDataAsString != null) {
-                vnfDataAsObject = objectMapper.readValue(vnfDataAsString, GenericResourceApiServicedataServicedataVnfsVnfVnfData.class);
+                vnfDataAsObject = getUnwrappedObjectMapper().readValue(vnfDataAsString, GenericResourceApiServicedataServicedataVnfsVnfVnfData.class);
             }
 
             GenericResourceApiServicedataServicedataVnfsVnfVnfdataVfModules vfModules = getVfModules(svcInstanceId, vnfId);
@@ -232,7 +245,7 @@ public class ServiceDataHelper {
                 GenericResourceApiServicedataServicedataVnfsVnfVnfData vnfDataAsObject = null;
                 String vnfDataAsString = configVnf.getVnfData();
                 if (vnfDataAsString != null) {
-                    vnfDataAsObject = objectMapper.readValue(vnfDataAsString,
+                    vnfDataAsObject = getUnwrappedObjectMapper().readValue(vnfDataAsString,
                             GenericResourceApiServicedataServicedataVnfsVnfVnfData.class);
                 }
 
@@ -250,6 +263,32 @@ public class ServiceDataHelper {
         return (vnfs);
     }
 
+    public GenericResourceApiServicedataServicedataNetworksNetwork getNetwork(String svcInstanceId, String networkId) throws JsonProcessingException {
+        GenericResourceApiServicedataServicedataNetworksNetwork network = null;
+        List<ConfigNetworks> configNetworks = configNetworksRepository.findBySvcInstanceId(svcInstanceId);
+        if ((configNetworks != null) && !configNetworks.isEmpty()) {
+            network = new GenericResourceApiServicedataServicedataNetworksNetwork();
+            ConfigNetworks configNetwork = configNetworks.get(0);
+            network.setNetworkId(configNetwork.getNetworkId());
+            String networkDataAsString = configNetwork.getNetworkData();
+            if (networkDataAsString != null) {
+                network.setNetworkData(getUnwrappedObjectMapper().readValue(networkDataAsString, GenericResourceApiServicedataServicedataNetworksNetworkNetworkData.class));
+            }
+        }
+
+        return(network);
+    }
+
+    public boolean networkExists(String svcInstanceId, String networkId) {
+        List<ConfigNetworks> configNetworks = configNetworksRepository.findBySvcInstanceId(svcInstanceId);
+        if ((configNetworks != null) && !configNetworks.isEmpty()) {
+            return(true);
+        } else {
+            return(false);
+        }
+
+    }
+
     public GenericResourceApiServicedataServicedataNetworks getNetworks(String svcInstanceId) throws JsonProcessingException {
         GenericResourceApiServicedataServicedataNetworks networks = null;
         List<ConfigNetworks> configNetworks = configNetworksRepository.findBySvcInstanceId(svcInstanceId);
@@ -261,7 +300,7 @@ public class ServiceDataHelper {
                 network.setNetworkId(configNetwork.getNetworkId());
                 String networkDataAsString = configNetwork.getNetworkData();
                 if (networkDataAsString != null) {
-                    network.setNetworkData(objectMapper.readValue(networkDataAsString, GenericResourceApiServicedataServicedataNetworksNetworkNetworkData.class));
+                    network.setNetworkData(getUnwrappedObjectMapper().readValue(networkDataAsString, GenericResourceApiServicedataServicedataNetworksNetworkNetworkData.class));
                 }
                 networks.addNetworkItem(network);
             }
@@ -275,7 +314,7 @@ public class ServiceDataHelper {
         if (svcData == null) {
             return(null);
         } else {
-            return(objectMapper.writeValueAsString(getServiceData(svcInstanceId)));
+            return(getUnwrappedObjectMapper().writeValueAsString(getServiceData(svcInstanceId)));
         }
     }
 
@@ -299,7 +338,7 @@ public class ServiceDataHelper {
         String svcDataAsString = configService.getSvcData();
 
         if ((svcDataAsString != null) && !svcDataAsString.isEmpty()) {
-            svcData = objectMapper.readValue(svcDataAsString, GenericResourceApiServicedataServiceData.class);
+            svcData = getUnwrappedObjectMapper().readValue(svcDataAsString, GenericResourceApiServicedataServiceData.class);
         } else {
             svcData = new GenericResourceApiServicedataServiceData();
         }
@@ -332,7 +371,7 @@ public class ServiceDataHelper {
             configVfModule = new ConfigVfModules(svcInstanceId, vnfId, vfModule.getVfModuleId());
         }
         if (vfModule.getVfModuleData() != null) {
-            configVfModule.setVfModuleData(objectMapper.writeValueAsString(vfModule.getVfModuleData()));
+            configVfModule.setVfModuleData(getUnwrappedObjectMapper().writeValueAsString(vfModule.getVfModuleData()));
         }
         if (transaction != null) {
             transaction.save(configVfModule);
@@ -359,7 +398,10 @@ public class ServiceDataHelper {
 
 
         // Save vf modules
-        GenericResourceApiServicedataServicedataVnfsVnfVnfdataVfModules vfModules = vnfData.getVfModules();
+        GenericResourceApiServicedataServicedataVnfsVnfVnfdataVfModules vfModules = null;
+        if (vnfData!= null) {
+            vfModules = vnfData.getVfModules();
+        }
         if (vfModules != null) {
             List<GenericResourceApiServicedataServicedataVnfsVnfVnfdataVfmodulesVfModule> vfModuleList = vfModules.getVfModule();
             if ((vfModuleList != null) && !vfModuleList.isEmpty()) {
@@ -391,7 +433,11 @@ public class ServiceDataHelper {
         } else {
             configVnf = new ConfigVnfs(svcInstanceId, vnf.getVnfId());
         }
-        configVnf.setVnfData(objectMapper.writeValueAsString(vnfData));
+        if (vnfData == null) {
+            configVnf.setVnfData(null);
+        } else {
+            configVnf.setVnfData(getUnwrappedObjectMapper().writeValueAsString(vnfData));
+        }
 
         if (transaction != null) {
             transaction.save(configVnf);
@@ -410,7 +456,7 @@ public class ServiceDataHelper {
         } else {
             configNetwork = new ConfigNetworks(svcInstanceId, network.getNetworkId());
         }
-        configNetwork.setNetworkData(objectMapper.writeValueAsString(network.getNetworkData()));
+        configNetwork.setNetworkData(getUnwrappedObjectMapper().writeValueAsString(network.getNetworkData()));
         if (transaction != null) {
             transaction.save(configNetwork);
         } else {
@@ -428,7 +474,7 @@ public class ServiceDataHelper {
             configService.setSvcData(null);
             configServicesRepository.save(configService);
         } else {
-            saveService(configService, objectMapper.readValue(svcDataAsString, GenericResourceApiServicedataServiceData.class), transaction);
+            saveService(configService, getUnwrappedObjectMapper().readValue(svcDataAsString, GenericResourceApiServicedataServiceData.class), transaction);
         }
     }
 
@@ -509,7 +555,7 @@ public class ServiceDataHelper {
             }
             svcData.setVnfs(null);
 
-            configService.setSvcData(objectMapper.writeValueAsString(svcData));
+            configService.setSvcData(getUnwrappedObjectMapper().writeValueAsString(svcData));
         }
         if (transaction != null) {
             transaction.save(configService);
index 8fcf6d2..cc0fa32 100644 (file)
@@ -20,6 +20,8 @@ public class ConfigContrailRouteAllottedResources {
     // allottedResource status fields
     String allottedResourceStatusResponseCode;
 
+    @Length(max = 2000)
+    @Column(length = 2000)
     String allottedResourceStatusResponseMessage;
 
     String allottedResourceStatusFinalIndicator;
index 347fe59..a036c53 100644 (file)
@@ -20,6 +20,8 @@ public class ConfigPortMirrorConfigurations {
     // portMirrorConfiguration status fields
     String portMirrorConfigurationStatusResponseCode;
 
+    @Length(max = 2000)
+    @Column(length = 2000)
     String portMirrorConfigurationStatusResponseMessage;
 
     String portMirrorConfigurationStatusFinalIndicator;
index bf5d862..3ac5f83 100644 (file)
@@ -21,6 +21,8 @@ public class ConfigServices {
     // Service status fields
     String serviceStatusResponseCode;
 
+    @Length(max = 2000)
+    @Column(length = 2000)
     String serviceStatusResponseMessage;
 
     String serviceStatusFinalIndicator;
index 51ab88f..a32c666 100644 (file)
@@ -20,6 +20,8 @@ public class OperationalContrailRouteAllottedResources {
     // allottedResource status fields
     String allottedResourceStatusResponseCode;
 
+    @Length(max = 2000)
+    @Column(length = 2000)
     String allottedResourceStatusResponseMessage;
 
     String allottedResourceStatusFinalIndicator;
index da9c0ce..821050a 100644 (file)
@@ -20,6 +20,8 @@ public class OperationalPortMirrorConfigurations {
     // portMirrorConfiguration status fields
     String portMirrorConfigurationStatusResponseCode;
 
+    @Length(max = 2000)
+    @Column(length = 2000)
     String portMirrorConfigurationStatusResponseMessage;
 
     String portMirrorConfigurationStatusFinalIndicator;
diff --git a/ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/swagger/model/GenericResourceApiContrailRouteAllottedResources.java b/ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/swagger/model/GenericResourceApiContrailRouteAllottedResources.java
new file mode 100644 (file)
index 0000000..86e1f0b
--- /dev/null
@@ -0,0 +1,95 @@
+package org.onap.sdnc.apps.ms.gra.swagger.model;
+
+import java.util.Objects;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonRootName;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import java.util.ArrayList;
+import java.util.List;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiContrailrouteallottedresourcesContrailRouteAllottedResource;
+import org.springframework.validation.annotation.Validated;
+import javax.validation.Valid;
+import javax.validation.constraints.*;
+
+/**
+ * GenericResourceApiContrailRouteAllottedResources
+ */
+@Validated
+@javax.annotation.Generated(value = "io.swagger.codegen.languages.SpringCodegen", date = "2021-07-26T13:29:23.962-04:00")
+@JsonRootName("contrail-route-allotted-resources")
+public class GenericResourceApiContrailRouteAllottedResources   {
+  @JsonProperty("contrail-route-allotted-resource")
+  @Valid
+  private List<GenericResourceApiContrailrouteallottedresourcesContrailRouteAllottedResource> contrailRouteAllottedResource = null;
+
+  public GenericResourceApiContrailRouteAllottedResources contrailRouteAllottedResource(List<GenericResourceApiContrailrouteallottedresourcesContrailRouteAllottedResource> contrailRouteAllottedResource) {
+    this.contrailRouteAllottedResource = contrailRouteAllottedResource;
+    return this;
+  }
+
+  public GenericResourceApiContrailRouteAllottedResources addContrailRouteAllottedResourceItem(GenericResourceApiContrailrouteallottedresourcesContrailRouteAllottedResource contrailRouteAllottedResourceItem) {
+    if (this.contrailRouteAllottedResource == null) {
+      this.contrailRouteAllottedResource = new ArrayList<>();
+    }
+    this.contrailRouteAllottedResource.add(contrailRouteAllottedResourceItem);
+    return this;
+  }
+
+  /**
+   * Get contrailRouteAllottedResource
+   * @return contrailRouteAllottedResource
+  **/
+  @ApiModelProperty(value = "")
+
+  @Valid
+
+  public List<GenericResourceApiContrailrouteallottedresourcesContrailRouteAllottedResource> getContrailRouteAllottedResource() {
+    return contrailRouteAllottedResource;
+  }
+
+  public void setContrailRouteAllottedResource(List<GenericResourceApiContrailrouteallottedresourcesContrailRouteAllottedResource> contrailRouteAllottedResource) {
+    this.contrailRouteAllottedResource = contrailRouteAllottedResource;
+  }
+
+
+  @Override
+  public boolean equals(java.lang.Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    GenericResourceApiContrailRouteAllottedResources genericResourceApiContrailRouteAllottedResources = (GenericResourceApiContrailRouteAllottedResources) o;
+    return Objects.equals(this.contrailRouteAllottedResource, genericResourceApiContrailRouteAllottedResources.contrailRouteAllottedResource);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(contrailRouteAllottedResource);
+  }
+
+  @Override
+  public String toString() {
+    StringBuilder sb = new StringBuilder();
+    sb.append("class GenericResourceApiContrailRouteAllottedResources {\n");
+    
+    sb.append("    contrailRouteAllottedResource: ").append(toIndentedString(contrailRouteAllottedResource)).append("\n");
+    sb.append("}");
+    return sb.toString();
+  }
+
+  /**
+   * Convert the given object to string with each line indented by 4 spaces
+   * (except the first line).
+   */
+  private String toIndentedString(java.lang.Object o) {
+    if (o == null) {
+      return "null";
+    }
+    return o.toString().replace("\n", "\n    ");
+  }
+}
+
diff --git a/ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/swagger/model/GenericResourceApiContrailrouteallottedresourcesContrailRouteAllottedResource.java b/ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/swagger/model/GenericResourceApiContrailrouteallottedresourcesContrailRouteAllottedResource.java
new file mode 100644 (file)
index 0000000..83975d6
--- /dev/null
@@ -0,0 +1,137 @@
+package org.onap.sdnc.apps.ms.gra.swagger.model;
+
+import java.util.Objects;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonRootName;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiAllottedResourceStatus;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiAllottedresourcestatusAllottedResourceStatus;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiContrailrouteallottedresourcesContrailrouteallottedresourceAllottedResourceData;
+import org.springframework.validation.annotation.Validated;
+import javax.validation.Valid;
+import javax.validation.constraints.*;
+
+/**
+ * GenericResourceApiContrailrouteallottedresourcesContrailRouteAllottedResource
+ */
+@Validated
+@javax.annotation.Generated(value = "io.swagger.codegen.languages.SpringCodegen", date = "2021-07-13T13:26:44.236-04:00")
+@JsonRootName("contrail-route-allotted-resource")
+public class GenericResourceApiContrailrouteallottedresourcesContrailRouteAllottedResource   {
+  @JsonProperty("allotted-resource-status")
+  private GenericResourceApiAllottedresourcestatusAllottedResourceStatus allottedResourceStatus = null;
+
+  @JsonProperty("allotted-resource-id")
+  private String allottedResourceId = null;
+
+  @JsonProperty("allotted-resource-data")
+  private GenericResourceApiContrailrouteallottedresourcesContrailrouteallottedresourceAllottedResourceData allottedResourceData = null;
+
+  public GenericResourceApiContrailrouteallottedresourcesContrailRouteAllottedResource allottedResourceStatus(GenericResourceApiAllottedresourcestatusAllottedResourceStatus allottedResourceStatus) {
+    this.allottedResourceStatus = allottedResourceStatus;
+    return this;
+  }
+
+  /**
+   * Get allottedResourceStatus
+   * @return allottedResourceStatus
+  **/
+  @ApiModelProperty(value = "")
+
+  @Valid
+
+  public GenericResourceApiAllottedresourcestatusAllottedResourceStatus getAllottedResourceStatus() {
+    return allottedResourceStatus;
+  }
+
+  public void setAllottedResourceStatus(GenericResourceApiAllottedresourcestatusAllottedResourceStatus allottedResourceStatus) {
+    this.allottedResourceStatus = allottedResourceStatus;
+  }
+
+  public GenericResourceApiContrailrouteallottedresourcesContrailRouteAllottedResource allottedResourceId(String allottedResourceId) {
+    this.allottedResourceId = allottedResourceId;
+    return this;
+  }
+
+  /**
+   * Get allottedResourceId
+   * @return allottedResourceId
+  **/
+  @ApiModelProperty(value = "")
+
+
+  public String getAllottedResourceId() {
+    return allottedResourceId;
+  }
+
+  public void setAllottedResourceId(String allottedResourceId) {
+    this.allottedResourceId = allottedResourceId;
+  }
+
+  public GenericResourceApiContrailrouteallottedresourcesContrailRouteAllottedResource allottedResourceData(GenericResourceApiContrailrouteallottedresourcesContrailrouteallottedresourceAllottedResourceData allottedResourceData) {
+    this.allottedResourceData = allottedResourceData;
+    return this;
+  }
+
+  /**
+   * Get allottedResourceData
+   * @return allottedResourceData
+  **/
+  @ApiModelProperty(value = "")
+
+  @Valid
+
+  public GenericResourceApiContrailrouteallottedresourcesContrailrouteallottedresourceAllottedResourceData getAllottedResourceData() {
+    return allottedResourceData;
+  }
+
+  public void setAllottedResourceData(GenericResourceApiContrailrouteallottedresourcesContrailrouteallottedresourceAllottedResourceData allottedResourceData) {
+    this.allottedResourceData = allottedResourceData;
+  }
+
+
+  @Override
+  public boolean equals(java.lang.Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    GenericResourceApiContrailrouteallottedresourcesContrailRouteAllottedResource genericResourceApiContrailrouteallottedresourcesContrailRouteAllottedResource = (GenericResourceApiContrailrouteallottedresourcesContrailRouteAllottedResource) o;
+    return Objects.equals(this.allottedResourceStatus, genericResourceApiContrailrouteallottedresourcesContrailRouteAllottedResource.allottedResourceStatus) &&
+        Objects.equals(this.allottedResourceId, genericResourceApiContrailrouteallottedresourcesContrailRouteAllottedResource.allottedResourceId) &&
+        Objects.equals(this.allottedResourceData, genericResourceApiContrailrouteallottedresourcesContrailRouteAllottedResource.allottedResourceData);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(allottedResourceStatus, allottedResourceId, allottedResourceData);
+  }
+
+  @Override
+  public String toString() {
+    StringBuilder sb = new StringBuilder();
+    sb.append("class GenericResourceApiContrailrouteallottedresourcesContrailRouteAllottedResource {\n");
+    
+    sb.append("    allottedResourceStatus: ").append(toIndentedString(allottedResourceStatus)).append("\n");
+    sb.append("    allottedResourceId: ").append(toIndentedString(allottedResourceId)).append("\n");
+    sb.append("    allottedResourceData: ").append(toIndentedString(allottedResourceData)).append("\n");
+    sb.append("}");
+    return sb.toString();
+  }
+
+  /**
+   * Convert the given object to string with each line indented by 4 spaces
+   * (except the first line).
+   */
+  private String toIndentedString(java.lang.Object o) {
+    if (o == null) {
+      return "null";
+    }
+    return o.toString().replace("\n", "\n    ");
+  }
+}
+
diff --git a/ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/swagger/model/GenericResourceApiContrailroutetopologyContrailRouteTopology.java b/ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/swagger/model/GenericResourceApiContrailroutetopologyContrailRouteTopology.java
new file mode 100644 (file)
index 0000000..cefc4a5
--- /dev/null
@@ -0,0 +1,168 @@
+package org.onap.sdnc.apps.ms.gra.swagger.model;
+
+import java.util.Objects;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonRootName;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiAllottedResourceIdentifiers;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiAllottedresourceidentifiersAllottedResourceIdentifiers;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiContrailRouteAssignments;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiContrailrouteassignmentsContrailRouteAssignments;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiOnapModelInformation;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiOnapmodelinformationOnapModelInformation;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiParam;
+import org.springframework.validation.annotation.Validated;
+import javax.validation.Valid;
+import javax.validation.constraints.*;
+
+/**
+ * GenericResourceApiContrailroutetopologyContrailRouteTopology
+ */
+@Validated
+@javax.annotation.Generated(value = "io.swagger.codegen.languages.SpringCodegen", date = "2021-07-13T13:26:44.236-04:00")
+@JsonRootName("contrail-route-topology")
+public class GenericResourceApiContrailroutetopologyContrailRouteTopology   {
+  @JsonProperty("allotted-resource-identifiers")
+  private GenericResourceApiAllottedresourceidentifiersAllottedResourceIdentifiers allottedResourceIdentifiers = null;
+
+  @JsonProperty("contrail-route-assignments")
+  private GenericResourceApiContrailrouteassignmentsContrailRouteAssignments contrailRouteAssignments = null;
+
+  @JsonProperty("onap-model-information")
+  private GenericResourceApiOnapmodelinformationOnapModelInformation onapModelInformation = null;
+
+  @JsonProperty("contrail-route-parameters")
+  private GenericResourceApiParam contrailRouteParameters = null;
+
+  public GenericResourceApiContrailroutetopologyContrailRouteTopology allottedResourceIdentifiers(GenericResourceApiAllottedresourceidentifiersAllottedResourceIdentifiers allottedResourceIdentifiers) {
+    this.allottedResourceIdentifiers = allottedResourceIdentifiers;
+    return this;
+  }
+
+  /**
+   * Get allottedResourceIdentifiers
+   * @return allottedResourceIdentifiers
+  **/
+  @ApiModelProperty(value = "")
+
+  @Valid
+
+  public GenericResourceApiAllottedresourceidentifiersAllottedResourceIdentifiers getAllottedResourceIdentifiers() {
+    return allottedResourceIdentifiers;
+  }
+
+  public void setAllottedResourceIdentifiers(GenericResourceApiAllottedresourceidentifiersAllottedResourceIdentifiers allottedResourceIdentifiers) {
+    this.allottedResourceIdentifiers = allottedResourceIdentifiers;
+  }
+
+  public GenericResourceApiContrailroutetopologyContrailRouteTopology contrailRouteAssignments(GenericResourceApiContrailrouteassignmentsContrailRouteAssignments contrailRouteAssignments) {
+    this.contrailRouteAssignments = contrailRouteAssignments;
+    return this;
+  }
+
+  /**
+   * Get contrailRouteAssignments
+   * @return contrailRouteAssignments
+  **/
+  @ApiModelProperty(value = "")
+
+  @Valid
+
+  public GenericResourceApiContrailrouteassignmentsContrailRouteAssignments getContrailRouteAssignments() {
+    return contrailRouteAssignments;
+  }
+
+  public void setContrailRouteAssignments(GenericResourceApiContrailrouteassignmentsContrailRouteAssignments contrailRouteAssignments) {
+    this.contrailRouteAssignments = contrailRouteAssignments;
+  }
+
+  public GenericResourceApiContrailroutetopologyContrailRouteTopology onapModelInformation(GenericResourceApiOnapmodelinformationOnapModelInformation onapModelInformation) {
+    this.onapModelInformation = onapModelInformation;
+    return this;
+  }
+
+  /**
+   * Get onapModelInformation
+   * @return onapModelInformation
+  **/
+  @ApiModelProperty(value = "")
+
+  @Valid
+
+  public GenericResourceApiOnapmodelinformationOnapModelInformation getOnapModelInformation() {
+    return onapModelInformation;
+  }
+
+  public void setOnapModelInformation(GenericResourceApiOnapmodelinformationOnapModelInformation onapModelInformation) {
+    this.onapModelInformation = onapModelInformation;
+  }
+
+  public GenericResourceApiContrailroutetopologyContrailRouteTopology contrailRouteParameters(GenericResourceApiParam contrailRouteParameters) {
+    this.contrailRouteParameters = contrailRouteParameters;
+    return this;
+  }
+
+  /**
+   * Get contrailRouteParameters
+   * @return contrailRouteParameters
+  **/
+  @ApiModelProperty(value = "")
+
+  @Valid
+
+  public GenericResourceApiParam getContrailRouteParameters() {
+    return contrailRouteParameters;
+  }
+
+  public void setContrailRouteParameters(GenericResourceApiParam contrailRouteParameters) {
+    this.contrailRouteParameters = contrailRouteParameters;
+  }
+
+
+  @Override
+  public boolean equals(java.lang.Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    GenericResourceApiContrailroutetopologyContrailRouteTopology genericResourceApiContrailroutetopologyContrailRouteTopology = (GenericResourceApiContrailroutetopologyContrailRouteTopology) o;
+    return Objects.equals(this.allottedResourceIdentifiers, genericResourceApiContrailroutetopologyContrailRouteTopology.allottedResourceIdentifiers) &&
+        Objects.equals(this.contrailRouteAssignments, genericResourceApiContrailroutetopologyContrailRouteTopology.contrailRouteAssignments) &&
+        Objects.equals(this.onapModelInformation, genericResourceApiContrailroutetopologyContrailRouteTopology.onapModelInformation) &&
+        Objects.equals(this.contrailRouteParameters, genericResourceApiContrailroutetopologyContrailRouteTopology.contrailRouteParameters);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(allottedResourceIdentifiers, contrailRouteAssignments, onapModelInformation, contrailRouteParameters);
+  }
+
+  @Override
+  public String toString() {
+    StringBuilder sb = new StringBuilder();
+    sb.append("class GenericResourceApiContrailroutetopologyContrailRouteTopology {\n");
+    
+    sb.append("    allottedResourceIdentifiers: ").append(toIndentedString(allottedResourceIdentifiers)).append("\n");
+    sb.append("    contrailRouteAssignments: ").append(toIndentedString(contrailRouteAssignments)).append("\n");
+    sb.append("    onapModelInformation: ").append(toIndentedString(onapModelInformation)).append("\n");
+    sb.append("    contrailRouteParameters: ").append(toIndentedString(contrailRouteParameters)).append("\n");
+    sb.append("}");
+    return sb.toString();
+  }
+
+  /**
+   * Convert the given object to string with each line indented by 4 spaces
+   * (except the first line).
+   */
+  private String toIndentedString(java.lang.Object o) {
+    if (o == null) {
+      return "null";
+    }
+    return o.toString().replace("\n", "\n    ");
+  }
+}
+
diff --git a/ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/swagger/model/GenericResourceApiNetworkinstancegroupNetworkInstanceGroup.java b/ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/swagger/model/GenericResourceApiNetworkinstancegroupNetworkInstanceGroup.java
new file mode 100644 (file)
index 0000000..d042bba
--- /dev/null
@@ -0,0 +1,369 @@
+package org.onap.sdnc.apps.ms.gra.swagger.model;
+
+import java.util.Objects;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonRootName;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import java.util.ArrayList;
+import java.util.List;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiAggregateRoutes;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiAggregateroutesAggregateRoutes;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiNetworkinstancegroupNetworkinstancegroupAggregateRoutePolicy;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiNetworkinstancegroupNetworkinstancegroupNetworks;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiNetworkinstancegroupNetworkinstancegroupSubnetAssignmentPolicy;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiNetworkinstancegroupNetworkinstancegroupVpnBindingPolicy;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiOnapModelInformation;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiOnapmodelinformationOnapModelInformation;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiSubnets;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiSubnetsSubnets;
+import org.springframework.validation.annotation.Validated;
+import javax.validation.Valid;
+import javax.validation.constraints.*;
+
+/**
+ * GenericResourceApiNetworkinstancegroupNetworkInstanceGroup
+ */
+@Validated
+@javax.annotation.Generated(value = "io.swagger.codegen.languages.SpringCodegen", date = "2021-07-23T12:02:01.518-04:00")
+@JsonRootName("network-instance-group")
+public class GenericResourceApiNetworkinstancegroupNetworkInstanceGroup   {
+  @JsonProperty("aggregate-routes")
+  @Valid
+  private List<GenericResourceApiAggregateroutesAggregateRoutes> aggregateRoutes = null;
+
+  @JsonProperty("onap-model-information")
+  private GenericResourceApiOnapmodelinformationOnapModelInformation onapModelInformation = null;
+
+  @JsonProperty("subnets")
+  @Valid
+  private List<GenericResourceApiSubnetsSubnets> subnets = null;
+
+  @JsonProperty("subnet-assignment-policy")
+  private GenericResourceApiNetworkinstancegroupNetworkinstancegroupSubnetAssignmentPolicy subnetAssignmentPolicy = null;
+
+  @JsonProperty("service-instance-id")
+  private String serviceInstanceId = null;
+
+  @JsonProperty("vpn-binding-policy")
+  private GenericResourceApiNetworkinstancegroupNetworkinstancegroupVpnBindingPolicy vpnBindingPolicy = null;
+
+  @JsonProperty("network-instance-group-id")
+  private String networkInstanceGroupId = null;
+
+  @JsonProperty("network-instance-group-function")
+  private String networkInstanceGroupFunction = null;
+
+  @JsonProperty("networks")
+  private GenericResourceApiNetworkinstancegroupNetworkinstancegroupNetworks networks = null;
+
+  @JsonProperty("aggregate-route-policy")
+  private GenericResourceApiNetworkinstancegroupNetworkinstancegroupAggregateRoutePolicy aggregateRoutePolicy = null;
+
+  @JsonProperty("subnet-key-value")
+  private String subnetKeyValue = null;
+
+  public GenericResourceApiNetworkinstancegroupNetworkInstanceGroup aggregateRoutes(List<GenericResourceApiAggregateroutesAggregateRoutes> aggregateRoutes) {
+    this.aggregateRoutes = aggregateRoutes;
+    return this;
+  }
+
+  public GenericResourceApiNetworkinstancegroupNetworkInstanceGroup addAggregateRoutesItem(GenericResourceApiAggregateroutesAggregateRoutes aggregateRoutesItem) {
+    if (this.aggregateRoutes == null) {
+      this.aggregateRoutes = new ArrayList<>();
+    }
+    this.aggregateRoutes.add(aggregateRoutesItem);
+    return this;
+  }
+
+  /**
+   * Get aggregateRoutes
+   * @return aggregateRoutes
+  **/
+  @ApiModelProperty(value = "")
+
+  @Valid
+
+  public List<GenericResourceApiAggregateroutesAggregateRoutes> getAggregateRoutes() {
+    return aggregateRoutes;
+  }
+
+  public void setAggregateRoutes(List<GenericResourceApiAggregateroutesAggregateRoutes> aggregateRoutes) {
+    this.aggregateRoutes = aggregateRoutes;
+  }
+
+  public GenericResourceApiNetworkinstancegroupNetworkInstanceGroup onapModelInformation(GenericResourceApiOnapmodelinformationOnapModelInformation onapModelInformation) {
+    this.onapModelInformation = onapModelInformation;
+    return this;
+  }
+
+  /**
+   * Get onapModelInformation
+   * @return onapModelInformation
+  **/
+  @ApiModelProperty(value = "")
+
+  @Valid
+
+  public GenericResourceApiOnapmodelinformationOnapModelInformation getOnapModelInformation() {
+    return onapModelInformation;
+  }
+
+  public void setOnapModelInformation(GenericResourceApiOnapmodelinformationOnapModelInformation onapModelInformation) {
+    this.onapModelInformation = onapModelInformation;
+  }
+
+  public GenericResourceApiNetworkinstancegroupNetworkInstanceGroup subnets(List<GenericResourceApiSubnetsSubnets> subnets) {
+    this.subnets = subnets;
+    return this;
+  }
+
+  public GenericResourceApiNetworkinstancegroupNetworkInstanceGroup addSubnetsItem(GenericResourceApiSubnetsSubnets subnetsItem) {
+    if (this.subnets == null) {
+      this.subnets = new ArrayList<>();
+    }
+    this.subnets.add(subnetsItem);
+    return this;
+  }
+
+  /**
+   * Get subnets
+   * @return subnets
+  **/
+  @ApiModelProperty(value = "")
+
+  @Valid
+
+  public List<GenericResourceApiSubnetsSubnets> getSubnets() {
+    return subnets;
+  }
+
+  public void setSubnets(List<GenericResourceApiSubnetsSubnets> subnets) {
+    this.subnets = subnets;
+  }
+
+  public GenericResourceApiNetworkinstancegroupNetworkInstanceGroup subnetAssignmentPolicy(GenericResourceApiNetworkinstancegroupNetworkinstancegroupSubnetAssignmentPolicy subnetAssignmentPolicy) {
+    this.subnetAssignmentPolicy = subnetAssignmentPolicy;
+    return this;
+  }
+
+  /**
+   * Get subnetAssignmentPolicy
+   * @return subnetAssignmentPolicy
+  **/
+  @ApiModelProperty(value = "")
+
+  @Valid
+
+  public GenericResourceApiNetworkinstancegroupNetworkinstancegroupSubnetAssignmentPolicy getSubnetAssignmentPolicy() {
+    return subnetAssignmentPolicy;
+  }
+
+  public void setSubnetAssignmentPolicy(GenericResourceApiNetworkinstancegroupNetworkinstancegroupSubnetAssignmentPolicy subnetAssignmentPolicy) {
+    this.subnetAssignmentPolicy = subnetAssignmentPolicy;
+  }
+
+  public GenericResourceApiNetworkinstancegroupNetworkInstanceGroup serviceInstanceId(String serviceInstanceId) {
+    this.serviceInstanceId = serviceInstanceId;
+    return this;
+  }
+
+  /**
+   * Get serviceInstanceId
+   * @return serviceInstanceId
+  **/
+  @ApiModelProperty(value = "")
+
+
+  public String getServiceInstanceId() {
+    return serviceInstanceId;
+  }
+
+  public void setServiceInstanceId(String serviceInstanceId) {
+    this.serviceInstanceId = serviceInstanceId;
+  }
+
+  public GenericResourceApiNetworkinstancegroupNetworkInstanceGroup vpnBindingPolicy(GenericResourceApiNetworkinstancegroupNetworkinstancegroupVpnBindingPolicy vpnBindingPolicy) {
+    this.vpnBindingPolicy = vpnBindingPolicy;
+    return this;
+  }
+
+  /**
+   * Get vpnBindingPolicy
+   * @return vpnBindingPolicy
+  **/
+  @ApiModelProperty(value = "")
+
+  @Valid
+
+  public GenericResourceApiNetworkinstancegroupNetworkinstancegroupVpnBindingPolicy getVpnBindingPolicy() {
+    return vpnBindingPolicy;
+  }
+
+  public void setVpnBindingPolicy(GenericResourceApiNetworkinstancegroupNetworkinstancegroupVpnBindingPolicy vpnBindingPolicy) {
+    this.vpnBindingPolicy = vpnBindingPolicy;
+  }
+
+  public GenericResourceApiNetworkinstancegroupNetworkInstanceGroup networkInstanceGroupId(String networkInstanceGroupId) {
+    this.networkInstanceGroupId = networkInstanceGroupId;
+    return this;
+  }
+
+  /**
+   * Also a Key in Network Instance Group in A&AI
+   * @return networkInstanceGroupId
+  **/
+  @ApiModelProperty(value = "Also a Key in Network Instance Group in A&AI")
+
+
+  public String getNetworkInstanceGroupId() {
+    return networkInstanceGroupId;
+  }
+
+  public void setNetworkInstanceGroupId(String networkInstanceGroupId) {
+    this.networkInstanceGroupId = networkInstanceGroupId;
+  }
+
+  public GenericResourceApiNetworkinstancegroupNetworkInstanceGroup networkInstanceGroupFunction(String networkInstanceGroupFunction) {
+    this.networkInstanceGroupFunction = networkInstanceGroupFunction;
+    return this;
+  }
+
+  /**
+   * Get networkInstanceGroupFunction
+   * @return networkInstanceGroupFunction
+  **/
+  @ApiModelProperty(value = "")
+
+
+  public String getNetworkInstanceGroupFunction() {
+    return networkInstanceGroupFunction;
+  }
+
+  public void setNetworkInstanceGroupFunction(String networkInstanceGroupFunction) {
+    this.networkInstanceGroupFunction = networkInstanceGroupFunction;
+  }
+
+  public GenericResourceApiNetworkinstancegroupNetworkInstanceGroup networks(GenericResourceApiNetworkinstancegroupNetworkinstancegroupNetworks networks) {
+    this.networks = networks;
+    return this;
+  }
+
+  /**
+   * Get networks
+   * @return networks
+  **/
+  @ApiModelProperty(value = "")
+
+  @Valid
+
+  public GenericResourceApiNetworkinstancegroupNetworkinstancegroupNetworks getNetworks() {
+    return networks;
+  }
+
+  public void setNetworks(GenericResourceApiNetworkinstancegroupNetworkinstancegroupNetworks networks) {
+    this.networks = networks;
+  }
+
+  public GenericResourceApiNetworkinstancegroupNetworkInstanceGroup aggregateRoutePolicy(GenericResourceApiNetworkinstancegroupNetworkinstancegroupAggregateRoutePolicy aggregateRoutePolicy) {
+    this.aggregateRoutePolicy = aggregateRoutePolicy;
+    return this;
+  }
+
+  /**
+   * Get aggregateRoutePolicy
+   * @return aggregateRoutePolicy
+  **/
+  @ApiModelProperty(value = "")
+
+  @Valid
+
+  public GenericResourceApiNetworkinstancegroupNetworkinstancegroupAggregateRoutePolicy getAggregateRoutePolicy() {
+    return aggregateRoutePolicy;
+  }
+
+  public void setAggregateRoutePolicy(GenericResourceApiNetworkinstancegroupNetworkinstancegroupAggregateRoutePolicy aggregateRoutePolicy) {
+    this.aggregateRoutePolicy = aggregateRoutePolicy;
+  }
+
+  public GenericResourceApiNetworkinstancegroupNetworkInstanceGroup subnetKeyValue(String subnetKeyValue) {
+    this.subnetKeyValue = subnetKeyValue;
+    return this;
+  }
+
+  /**
+   * key-value provided to IPAM when  creating shared subnet
+   * @return subnetKeyValue
+  **/
+  @ApiModelProperty(value = "key-value provided to IPAM when  creating shared subnet")
+
+
+  public String getSubnetKeyValue() {
+    return subnetKeyValue;
+  }
+
+  public void setSubnetKeyValue(String subnetKeyValue) {
+    this.subnetKeyValue = subnetKeyValue;
+  }
+
+
+  @Override
+  public boolean equals(java.lang.Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    GenericResourceApiNetworkinstancegroupNetworkInstanceGroup genericResourceApiNetworkinstancegroupNetworkInstanceGroup = (GenericResourceApiNetworkinstancegroupNetworkInstanceGroup) o;
+    return Objects.equals(this.aggregateRoutes, genericResourceApiNetworkinstancegroupNetworkInstanceGroup.aggregateRoutes) &&
+        Objects.equals(this.onapModelInformation, genericResourceApiNetworkinstancegroupNetworkInstanceGroup.onapModelInformation) &&
+        Objects.equals(this.subnets, genericResourceApiNetworkinstancegroupNetworkInstanceGroup.subnets) &&
+        Objects.equals(this.subnetAssignmentPolicy, genericResourceApiNetworkinstancegroupNetworkInstanceGroup.subnetAssignmentPolicy) &&
+        Objects.equals(this.serviceInstanceId, genericResourceApiNetworkinstancegroupNetworkInstanceGroup.serviceInstanceId) &&
+        Objects.equals(this.vpnBindingPolicy, genericResourceApiNetworkinstancegroupNetworkInstanceGroup.vpnBindingPolicy) &&
+        Objects.equals(this.networkInstanceGroupId, genericResourceApiNetworkinstancegroupNetworkInstanceGroup.networkInstanceGroupId) &&
+        Objects.equals(this.networkInstanceGroupFunction, genericResourceApiNetworkinstancegroupNetworkInstanceGroup.networkInstanceGroupFunction) &&
+        Objects.equals(this.networks, genericResourceApiNetworkinstancegroupNetworkInstanceGroup.networks) &&
+        Objects.equals(this.aggregateRoutePolicy, genericResourceApiNetworkinstancegroupNetworkInstanceGroup.aggregateRoutePolicy) &&
+        Objects.equals(this.subnetKeyValue, genericResourceApiNetworkinstancegroupNetworkInstanceGroup.subnetKeyValue);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(aggregateRoutes, onapModelInformation, subnets, subnetAssignmentPolicy, serviceInstanceId, vpnBindingPolicy, networkInstanceGroupId, networkInstanceGroupFunction, networks, aggregateRoutePolicy, subnetKeyValue);
+  }
+
+  @Override
+  public String toString() {
+    StringBuilder sb = new StringBuilder();
+    sb.append("class GenericResourceApiNetworkinstancegroupNetworkInstanceGroup {\n");
+    
+    sb.append("    aggregateRoutes: ").append(toIndentedString(aggregateRoutes)).append("\n");
+    sb.append("    onapModelInformation: ").append(toIndentedString(onapModelInformation)).append("\n");
+    sb.append("    subnets: ").append(toIndentedString(subnets)).append("\n");
+    sb.append("    subnetAssignmentPolicy: ").append(toIndentedString(subnetAssignmentPolicy)).append("\n");
+    sb.append("    serviceInstanceId: ").append(toIndentedString(serviceInstanceId)).append("\n");
+    sb.append("    vpnBindingPolicy: ").append(toIndentedString(vpnBindingPolicy)).append("\n");
+    sb.append("    networkInstanceGroupId: ").append(toIndentedString(networkInstanceGroupId)).append("\n");
+    sb.append("    networkInstanceGroupFunction: ").append(toIndentedString(networkInstanceGroupFunction)).append("\n");
+    sb.append("    networks: ").append(toIndentedString(networks)).append("\n");
+    sb.append("    aggregateRoutePolicy: ").append(toIndentedString(aggregateRoutePolicy)).append("\n");
+    sb.append("    subnetKeyValue: ").append(toIndentedString(subnetKeyValue)).append("\n");
+    sb.append("}");
+    return sb.toString();
+  }
+
+  /**
+   * Convert the given object to string with each line indented by 4 spaces
+   * (except the first line).
+   */
+  private String toIndentedString(java.lang.Object o) {
+    if (o == null) {
+      return "null";
+    }
+    return o.toString().replace("\n", "\n    ");
+  }
+}
+
diff --git a/ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/swagger/model/GenericResourceApiNetworkinstancegroupNetworkinstancegroupNetworksNetwork.java b/ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/swagger/model/GenericResourceApiNetworkinstancegroupNetworkinstancegroupNetworksNetwork.java
new file mode 100644 (file)
index 0000000..06ac646
--- /dev/null
@@ -0,0 +1,223 @@
+package org.onap.sdnc.apps.ms.gra.swagger.model;
+
+import java.util.Objects;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonRootName;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import java.util.ArrayList;
+import java.util.List;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiNetworkinstancegroupNetworkinstancegroupNetworksNetworkCustomerBondingRequests;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiVpnBindings;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiVpnbindingsVpnBindings;
+import org.springframework.validation.annotation.Validated;
+import javax.validation.Valid;
+import javax.validation.constraints.*;
+
+/**
+ * GenericResourceApiNetworkinstancegroupNetworkinstancegroupNetworksNetwork
+ */
+@Validated
+@javax.annotation.Generated(value = "io.swagger.codegen.languages.SpringCodegen", date = "2021-07-23T12:02:01.518-04:00")
+@JsonRootName("network")
+public class GenericResourceApiNetworkinstancegroupNetworkinstancegroupNetworksNetwork   {
+  @JsonProperty("vpn-bindings")
+  @Valid
+  private List<GenericResourceApiVpnbindingsVpnBindings> vpnBindings = null;
+
+  @JsonProperty("network-status")
+  private String networkStatus = null;
+
+  @JsonProperty("neutron-network-id")
+  private String neutronNetworkId = null;
+
+  @JsonProperty("network-id")
+  private String networkId = null;
+
+  @JsonProperty("customer-bonding-requests")
+  private GenericResourceApiNetworkinstancegroupNetworkinstancegroupNetworksNetworkCustomerBondingRequests customerBondingRequests = null;
+
+  @JsonProperty("vlan-tag-id")
+  private Long vlanTagId = null;
+
+  public GenericResourceApiNetworkinstancegroupNetworkinstancegroupNetworksNetwork vpnBindings(List<GenericResourceApiVpnbindingsVpnBindings> vpnBindings) {
+    this.vpnBindings = vpnBindings;
+    return this;
+  }
+
+  public GenericResourceApiNetworkinstancegroupNetworkinstancegroupNetworksNetwork addVpnBindingsItem(GenericResourceApiVpnbindingsVpnBindings vpnBindingsItem) {
+    if (this.vpnBindings == null) {
+      this.vpnBindings = new ArrayList<>();
+    }
+    this.vpnBindings.add(vpnBindingsItem);
+    return this;
+  }
+
+  /**
+   * Get vpnBindings
+   * @return vpnBindings
+  **/
+  @ApiModelProperty(value = "")
+
+  @Valid
+
+  public List<GenericResourceApiVpnbindingsVpnBindings> getVpnBindings() {
+    return vpnBindings;
+  }
+
+  public void setVpnBindings(List<GenericResourceApiVpnbindingsVpnBindings> vpnBindings) {
+    this.vpnBindings = vpnBindings;
+  }
+
+  public GenericResourceApiNetworkinstancegroupNetworkinstancegroupNetworksNetwork networkStatus(String networkStatus) {
+    this.networkStatus = networkStatus;
+    return this;
+  }
+
+  /**
+   * assigned, unassigned
+   * @return networkStatus
+  **/
+  @ApiModelProperty(value = "assigned, unassigned")
+
+
+  public String getNetworkStatus() {
+    return networkStatus;
+  }
+
+  public void setNetworkStatus(String networkStatus) {
+    this.networkStatus = networkStatus;
+  }
+
+  public GenericResourceApiNetworkinstancegroupNetworkinstancegroupNetworksNetwork neutronNetworkId(String neutronNetworkId) {
+    this.neutronNetworkId = neutronNetworkId;
+    return this;
+  }
+
+  /**
+   * Neutron-network-id assigned by PO/RO
+   * @return neutronNetworkId
+  **/
+  @ApiModelProperty(value = "Neutron-network-id assigned by PO/RO")
+
+
+  public String getNeutronNetworkId() {
+    return neutronNetworkId;
+  }
+
+  public void setNeutronNetworkId(String neutronNetworkId) {
+    this.neutronNetworkId = neutronNetworkId;
+  }
+
+  public GenericResourceApiNetworkinstancegroupNetworkinstancegroupNetworksNetwork networkId(String networkId) {
+    this.networkId = networkId;
+    return this;
+  }
+
+  /**
+   * Index into network-topology-identifier structure
+   * @return networkId
+  **/
+  @ApiModelProperty(value = "Index into network-topology-identifier structure")
+
+
+  public String getNetworkId() {
+    return networkId;
+  }
+
+  public void setNetworkId(String networkId) {
+    this.networkId = networkId;
+  }
+
+  public GenericResourceApiNetworkinstancegroupNetworkinstancegroupNetworksNetwork customerBondingRequests(GenericResourceApiNetworkinstancegroupNetworkinstancegroupNetworksNetworkCustomerBondingRequests customerBondingRequests) {
+    this.customerBondingRequests = customerBondingRequests;
+    return this;
+  }
+
+  /**
+   * Get customerBondingRequests
+   * @return customerBondingRequests
+  **/
+  @ApiModelProperty(value = "")
+
+  @Valid
+
+  public GenericResourceApiNetworkinstancegroupNetworkinstancegroupNetworksNetworkCustomerBondingRequests getCustomerBondingRequests() {
+    return customerBondingRequests;
+  }
+
+  public void setCustomerBondingRequests(GenericResourceApiNetworkinstancegroupNetworkinstancegroupNetworksNetworkCustomerBondingRequests customerBondingRequests) {
+    this.customerBondingRequests = customerBondingRequests;
+  }
+
+  public GenericResourceApiNetworkinstancegroupNetworkinstancegroupNetworksNetwork vlanTagId(Long vlanTagId) {
+    this.vlanTagId = vlanTagId;
+    return this;
+  }
+
+  /**
+   * Get vlanTagId
+   * @return vlanTagId
+  **/
+  @ApiModelProperty(value = "")
+
+
+  public Long getVlanTagId() {
+    return vlanTagId;
+  }
+
+  public void setVlanTagId(Long vlanTagId) {
+    this.vlanTagId = vlanTagId;
+  }
+
+
+  @Override
+  public boolean equals(java.lang.Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    GenericResourceApiNetworkinstancegroupNetworkinstancegroupNetworksNetwork genericResourceApiNetworkinstancegroupNetworkinstancegroupNetworksNetwork = (GenericResourceApiNetworkinstancegroupNetworkinstancegroupNetworksNetwork) o;
+    return Objects.equals(this.vpnBindings, genericResourceApiNetworkinstancegroupNetworkinstancegroupNetworksNetwork.vpnBindings) &&
+        Objects.equals(this.networkStatus, genericResourceApiNetworkinstancegroupNetworkinstancegroupNetworksNetwork.networkStatus) &&
+        Objects.equals(this.neutronNetworkId, genericResourceApiNetworkinstancegroupNetworkinstancegroupNetworksNetwork.neutronNetworkId) &&
+        Objects.equals(this.networkId, genericResourceApiNetworkinstancegroupNetworkinstancegroupNetworksNetwork.networkId) &&
+        Objects.equals(this.customerBondingRequests, genericResourceApiNetworkinstancegroupNetworkinstancegroupNetworksNetwork.customerBondingRequests) &&
+        Objects.equals(this.vlanTagId, genericResourceApiNetworkinstancegroupNetworkinstancegroupNetworksNetwork.vlanTagId);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(vpnBindings, networkStatus, neutronNetworkId, networkId, customerBondingRequests, vlanTagId);
+  }
+
+  @Override
+  public String toString() {
+    StringBuilder sb = new StringBuilder();
+    sb.append("class GenericResourceApiNetworkinstancegroupNetworkinstancegroupNetworksNetwork {\n");
+    
+    sb.append("    vpnBindings: ").append(toIndentedString(vpnBindings)).append("\n");
+    sb.append("    networkStatus: ").append(toIndentedString(networkStatus)).append("\n");
+    sb.append("    neutronNetworkId: ").append(toIndentedString(neutronNetworkId)).append("\n");
+    sb.append("    networkId: ").append(toIndentedString(networkId)).append("\n");
+    sb.append("    customerBondingRequests: ").append(toIndentedString(customerBondingRequests)).append("\n");
+    sb.append("    vlanTagId: ").append(toIndentedString(vlanTagId)).append("\n");
+    sb.append("}");
+    return sb.toString();
+  }
+
+  /**
+   * Convert the given object to string with each line indented by 4 spaces
+   * (except the first line).
+   */
+  private String toIndentedString(java.lang.Object o) {
+    if (o == null) {
+      return "null";
+    }
+    return o.toString().replace("\n", "\n    ");
+  }
+}
+
diff --git a/ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/swagger/model/GenericResourceApiNetworktopologyidentifierstructureNetworkTopologyIdentifierStructure.java b/ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/swagger/model/GenericResourceApiNetworktopologyidentifierstructureNetworkTopologyIdentifierStructure.java
new file mode 100644 (file)
index 0000000..1a80485
--- /dev/null
@@ -0,0 +1,334 @@
+package org.onap.sdnc.apps.ms.gra.swagger.model;
+
+import java.util.Objects;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonRootName;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiRelatedNetwork;
+import org.springframework.validation.annotation.Validated;
+import javax.validation.Valid;
+import javax.validation.constraints.*;
+
+/**
+ * GenericResourceApiNetworktopologyidentifierstructureNetworkTopologyIdentifierStructure
+ */
+@Validated
+@javax.annotation.Generated(value = "io.swagger.codegen.languages.SpringCodegen", date = "2021-07-23T12:02:01.518-04:00")
+@JsonRootName("network-topology-identifier-structure")
+public class GenericResourceApiNetworktopologyidentifierstructureNetworkTopologyIdentifierStructure   {
+  @JsonProperty("related-networks")
+  private GenericResourceApiRelatedNetwork relatedNetworks = null;
+
+  @JsonProperty("network-role")
+  private String networkRole = null;
+
+  @JsonProperty("is-trunked")
+  private Boolean isTrunked = null;
+
+  @JsonProperty("network-technology")
+  private String networkTechnology = null;
+
+  @JsonProperty("network-id")
+  private String networkId = null;
+
+  @JsonProperty("eipam-v4-address-plan")
+  private String eipamV4AddressPlan = null;
+
+  @JsonProperty("network-instance-group-id")
+  private String networkInstanceGroupId = null;
+
+  @JsonProperty("network-name")
+  private String networkName = null;
+
+  @JsonProperty("segmentation-id")
+  private String segmentationId = null;
+
+  @JsonProperty("eipam-v6-address-plan")
+  private String eipamV6AddressPlan = null;
+
+  @JsonProperty("network-type")
+  private String networkType = null;
+
+  public GenericResourceApiNetworktopologyidentifierstructureNetworkTopologyIdentifierStructure relatedNetworks(GenericResourceApiRelatedNetwork relatedNetworks) {
+    this.relatedNetworks = relatedNetworks;
+    return this;
+  }
+
+  /**
+   * Get relatedNetworks
+   * @return relatedNetworks
+  **/
+  @ApiModelProperty(value = "")
+
+  @Valid
+
+  public GenericResourceApiRelatedNetwork getRelatedNetworks() {
+    return relatedNetworks;
+  }
+
+  public void setRelatedNetworks(GenericResourceApiRelatedNetwork relatedNetworks) {
+    this.relatedNetworks = relatedNetworks;
+  }
+
+  public GenericResourceApiNetworktopologyidentifierstructureNetworkTopologyIdentifierStructure networkRole(String networkRole) {
+    this.networkRole = networkRole;
+    return this;
+  }
+
+  /**
+   * Get networkRole
+   * @return networkRole
+  **/
+  @ApiModelProperty(value = "")
+
+
+  public String getNetworkRole() {
+    return networkRole;
+  }
+
+  public void setNetworkRole(String networkRole) {
+    this.networkRole = networkRole;
+  }
+
+  public GenericResourceApiNetworktopologyidentifierstructureNetworkTopologyIdentifierStructure isTrunked(Boolean isTrunked) {
+    this.isTrunked = isTrunked;
+    return this;
+  }
+
+  /**
+   * Get isTrunked
+   * @return isTrunked
+  **/
+  @ApiModelProperty(value = "")
+
+
+  public Boolean isIsTrunked() {
+    return isTrunked;
+  }
+
+  public void setIsTrunked(Boolean isTrunked) {
+    this.isTrunked = isTrunked;
+  }
+
+  public GenericResourceApiNetworktopologyidentifierstructureNetworkTopologyIdentifierStructure networkTechnology(String networkTechnology) {
+    this.networkTechnology = networkTechnology;
+    return this;
+  }
+
+  /**
+   * Get networkTechnology
+   * @return networkTechnology
+  **/
+  @ApiModelProperty(value = "")
+
+
+  public String getNetworkTechnology() {
+    return networkTechnology;
+  }
+
+  public void setNetworkTechnology(String networkTechnology) {
+    this.networkTechnology = networkTechnology;
+  }
+
+  public GenericResourceApiNetworktopologyidentifierstructureNetworkTopologyIdentifierStructure networkId(String networkId) {
+    this.networkId = networkId;
+    return this;
+  }
+
+  /**
+   * Get networkId
+   * @return networkId
+  **/
+  @ApiModelProperty(value = "")
+
+
+  public String getNetworkId() {
+    return networkId;
+  }
+
+  public void setNetworkId(String networkId) {
+    this.networkId = networkId;
+  }
+
+  public GenericResourceApiNetworktopologyidentifierstructureNetworkTopologyIdentifierStructure eipamV4AddressPlan(String eipamV4AddressPlan) {
+    this.eipamV4AddressPlan = eipamV4AddressPlan;
+    return this;
+  }
+
+  /**
+   * Get eipamV4AddressPlan
+   * @return eipamV4AddressPlan
+  **/
+  @ApiModelProperty(value = "")
+
+
+  public String getEipamV4AddressPlan() {
+    return eipamV4AddressPlan;
+  }
+
+  public void setEipamV4AddressPlan(String eipamV4AddressPlan) {
+    this.eipamV4AddressPlan = eipamV4AddressPlan;
+  }
+
+  public GenericResourceApiNetworktopologyidentifierstructureNetworkTopologyIdentifierStructure networkInstanceGroupId(String networkInstanceGroupId) {
+    this.networkInstanceGroupId = networkInstanceGroupId;
+    return this;
+  }
+
+  /**
+   * When network is part of network instance-Group-data & instance Group in A&AI
+   * @return networkInstanceGroupId
+  **/
+  @ApiModelProperty(value = "When network is part of network instance-Group-data & instance Group in A&AI")
+
+
+  public String getNetworkInstanceGroupId() {
+    return networkInstanceGroupId;
+  }
+
+  public void setNetworkInstanceGroupId(String networkInstanceGroupId) {
+    this.networkInstanceGroupId = networkInstanceGroupId;
+  }
+
+  public GenericResourceApiNetworktopologyidentifierstructureNetworkTopologyIdentifierStructure networkName(String networkName) {
+    this.networkName = networkName;
+    return this;
+  }
+
+  /**
+   * Get networkName
+   * @return networkName
+  **/
+  @ApiModelProperty(value = "")
+
+
+  public String getNetworkName() {
+    return networkName;
+  }
+
+  public void setNetworkName(String networkName) {
+    this.networkName = networkName;
+  }
+
+  public GenericResourceApiNetworktopologyidentifierstructureNetworkTopologyIdentifierStructure segmentationId(String segmentationId) {
+    this.segmentationId = segmentationId;
+    return this;
+  }
+
+  /**
+   * Get segmentationId
+   * @return segmentationId
+  **/
+  @ApiModelProperty(value = "")
+
+
+  public String getSegmentationId() {
+    return segmentationId;
+  }
+
+  public void setSegmentationId(String segmentationId) {
+    this.segmentationId = segmentationId;
+  }
+
+  public GenericResourceApiNetworktopologyidentifierstructureNetworkTopologyIdentifierStructure eipamV6AddressPlan(String eipamV6AddressPlan) {
+    this.eipamV6AddressPlan = eipamV6AddressPlan;
+    return this;
+  }
+
+  /**
+   * Get eipamV6AddressPlan
+   * @return eipamV6AddressPlan
+  **/
+  @ApiModelProperty(value = "")
+
+
+  public String getEipamV6AddressPlan() {
+    return eipamV6AddressPlan;
+  }
+
+  public void setEipamV6AddressPlan(String eipamV6AddressPlan) {
+    this.eipamV6AddressPlan = eipamV6AddressPlan;
+  }
+
+  public GenericResourceApiNetworktopologyidentifierstructureNetworkTopologyIdentifierStructure networkType(String networkType) {
+    this.networkType = networkType;
+    return this;
+  }
+
+  /**
+   * Get networkType
+   * @return networkType
+  **/
+  @ApiModelProperty(value = "")
+
+
+  public String getNetworkType() {
+    return networkType;
+  }
+
+  public void setNetworkType(String networkType) {
+    this.networkType = networkType;
+  }
+
+
+  @Override
+  public boolean equals(java.lang.Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    GenericResourceApiNetworktopologyidentifierstructureNetworkTopologyIdentifierStructure genericResourceApiNetworktopologyidentifierstructureNetworkTopologyIdentifierStructure = (GenericResourceApiNetworktopologyidentifierstructureNetworkTopologyIdentifierStructure) o;
+    return Objects.equals(this.relatedNetworks, genericResourceApiNetworktopologyidentifierstructureNetworkTopologyIdentifierStructure.relatedNetworks) &&
+        Objects.equals(this.networkRole, genericResourceApiNetworktopologyidentifierstructureNetworkTopologyIdentifierStructure.networkRole) &&
+        Objects.equals(this.isTrunked, genericResourceApiNetworktopologyidentifierstructureNetworkTopologyIdentifierStructure.isTrunked) &&
+        Objects.equals(this.networkTechnology, genericResourceApiNetworktopologyidentifierstructureNetworkTopologyIdentifierStructure.networkTechnology) &&
+        Objects.equals(this.networkId, genericResourceApiNetworktopologyidentifierstructureNetworkTopologyIdentifierStructure.networkId) &&
+        Objects.equals(this.eipamV4AddressPlan, genericResourceApiNetworktopologyidentifierstructureNetworkTopologyIdentifierStructure.eipamV4AddressPlan) &&
+        Objects.equals(this.networkInstanceGroupId, genericResourceApiNetworktopologyidentifierstructureNetworkTopologyIdentifierStructure.networkInstanceGroupId) &&
+        Objects.equals(this.networkName, genericResourceApiNetworktopologyidentifierstructureNetworkTopologyIdentifierStructure.networkName) &&
+        Objects.equals(this.segmentationId, genericResourceApiNetworktopologyidentifierstructureNetworkTopologyIdentifierStructure.segmentationId) &&
+        Objects.equals(this.eipamV6AddressPlan, genericResourceApiNetworktopologyidentifierstructureNetworkTopologyIdentifierStructure.eipamV6AddressPlan) &&
+        Objects.equals(this.networkType, genericResourceApiNetworktopologyidentifierstructureNetworkTopologyIdentifierStructure.networkType);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(relatedNetworks, networkRole, isTrunked, networkTechnology, networkId, eipamV4AddressPlan, networkInstanceGroupId, networkName, segmentationId, eipamV6AddressPlan, networkType);
+  }
+
+  @Override
+  public String toString() {
+    StringBuilder sb = new StringBuilder();
+    sb.append("class GenericResourceApiNetworktopologyidentifierstructureNetworkTopologyIdentifierStructure {\n");
+    
+    sb.append("    relatedNetworks: ").append(toIndentedString(relatedNetworks)).append("\n");
+    sb.append("    networkRole: ").append(toIndentedString(networkRole)).append("\n");
+    sb.append("    isTrunked: ").append(toIndentedString(isTrunked)).append("\n");
+    sb.append("    networkTechnology: ").append(toIndentedString(networkTechnology)).append("\n");
+    sb.append("    networkId: ").append(toIndentedString(networkId)).append("\n");
+    sb.append("    eipamV4AddressPlan: ").append(toIndentedString(eipamV4AddressPlan)).append("\n");
+    sb.append("    networkInstanceGroupId: ").append(toIndentedString(networkInstanceGroupId)).append("\n");
+    sb.append("    networkName: ").append(toIndentedString(networkName)).append("\n");
+    sb.append("    segmentationId: ").append(toIndentedString(segmentationId)).append("\n");
+    sb.append("    eipamV6AddressPlan: ").append(toIndentedString(eipamV6AddressPlan)).append("\n");
+    sb.append("    networkType: ").append(toIndentedString(networkType)).append("\n");
+    sb.append("}");
+    return sb.toString();
+  }
+
+  /**
+   * Convert the given object to string with each line indented by 4 spaces
+   * (except the first line).
+   */
+  private String toIndentedString(java.lang.Object o) {
+    if (o == null) {
+      return "null";
+    }
+    return o.toString().replace("\n", "\n    ");
+  }
+}
+
diff --git a/ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/swagger/model/GenericResourceApiOnapmodelinformationOnapModelInformation.java b/ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/swagger/model/GenericResourceApiOnapmodelinformationOnapModelInformation.java
new file mode 100644 (file)
index 0000000..d6efbc6
--- /dev/null
@@ -0,0 +1,182 @@
+package org.onap.sdnc.apps.ms.gra.swagger.model;
+
+import java.util.Objects;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonRootName;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import org.springframework.validation.annotation.Validated;
+import javax.validation.Valid;
+import javax.validation.constraints.*;
+
+/**
+ * GenericResourceApiOnapmodelinformationOnapModelInformation
+ */
+@Validated
+@javax.annotation.Generated(value = "io.swagger.codegen.languages.SpringCodegen", date = "2021-07-26T09:20:20.871-04:00")
+@JsonRootName("onap-model-information")
+public class GenericResourceApiOnapmodelinformationOnapModelInformation   {
+  @JsonProperty("model-name")
+  private String modelName = null;
+
+  @JsonProperty("model-version")
+  private String modelVersion = null;
+
+  @JsonProperty("model-customization-uuid")
+  private String modelCustomizationUuid = null;
+
+  @JsonProperty("model-uuid")
+  private String modelUuid = null;
+
+  @JsonProperty("model-invariant-uuid")
+  private String modelInvariantUuid = null;
+
+  public GenericResourceApiOnapmodelinformationOnapModelInformation modelName(String modelName) {
+    this.modelName = modelName;
+    return this;
+  }
+
+  /**
+   * Get modelName
+   * @return modelName
+  **/
+  @ApiModelProperty(value = "")
+
+
+  public String getModelName() {
+    return modelName;
+  }
+
+  public void setModelName(String modelName) {
+    this.modelName = modelName;
+  }
+
+  public GenericResourceApiOnapmodelinformationOnapModelInformation modelVersion(String modelVersion) {
+    this.modelVersion = modelVersion;
+    return this;
+  }
+
+  /**
+   * Get modelVersion
+   * @return modelVersion
+  **/
+  @ApiModelProperty(value = "")
+
+
+  public String getModelVersion() {
+    return modelVersion;
+  }
+
+  public void setModelVersion(String modelVersion) {
+    this.modelVersion = modelVersion;
+  }
+
+  public GenericResourceApiOnapmodelinformationOnapModelInformation modelCustomizationUuid(String modelCustomizationUuid) {
+    this.modelCustomizationUuid = modelCustomizationUuid;
+    return this;
+  }
+
+  /**
+   * customized resource for use within a given service.Would not be present at the service level but would be present for the resource level
+   * @return modelCustomizationUuid
+  **/
+  @ApiModelProperty(value = "customized resource for use within a given service.Would not be present at the service level but would be present for the resource level")
+
+
+  public String getModelCustomizationUuid() {
+    return modelCustomizationUuid;
+  }
+
+  public void setModelCustomizationUuid(String modelCustomizationUuid) {
+    this.modelCustomizationUuid = modelCustomizationUuid;
+  }
+
+  public GenericResourceApiOnapmodelinformationOnapModelInformation modelUuid(String modelUuid) {
+    this.modelUuid = modelUuid;
+    return this;
+  }
+
+  /**
+   * identifies the uuid for this service or resource, which is version specific
+   * @return modelUuid
+  **/
+  @ApiModelProperty(value = "identifies the uuid for this service or resource, which is version specific")
+
+
+  public String getModelUuid() {
+    return modelUuid;
+  }
+
+  public void setModelUuid(String modelUuid) {
+    this.modelUuid = modelUuid;
+  }
+
+  public GenericResourceApiOnapmodelinformationOnapModelInformation modelInvariantUuid(String modelInvariantUuid) {
+    this.modelInvariantUuid = modelInvariantUuid;
+    return this;
+  }
+
+  /**
+   * identifies the invariant uuid for this service or resource
+   * @return modelInvariantUuid
+  **/
+  @ApiModelProperty(value = "identifies the invariant uuid for this service or resource")
+
+
+  public String getModelInvariantUuid() {
+    return modelInvariantUuid;
+  }
+
+  public void setModelInvariantUuid(String modelInvariantUuid) {
+    this.modelInvariantUuid = modelInvariantUuid;
+  }
+
+
+  @Override
+  public boolean equals(java.lang.Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    GenericResourceApiOnapmodelinformationOnapModelInformation genericResourceApiOnapmodelinformationOnapModelInformation = (GenericResourceApiOnapmodelinformationOnapModelInformation) o;
+    return Objects.equals(this.modelName, genericResourceApiOnapmodelinformationOnapModelInformation.modelName) &&
+        Objects.equals(this.modelVersion, genericResourceApiOnapmodelinformationOnapModelInformation.modelVersion) &&
+        Objects.equals(this.modelCustomizationUuid, genericResourceApiOnapmodelinformationOnapModelInformation.modelCustomizationUuid) &&
+        Objects.equals(this.modelUuid, genericResourceApiOnapmodelinformationOnapModelInformation.modelUuid) &&
+        Objects.equals(this.modelInvariantUuid, genericResourceApiOnapmodelinformationOnapModelInformation.modelInvariantUuid);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(modelName, modelVersion, modelCustomizationUuid, modelUuid, modelInvariantUuid);
+  }
+
+  @Override
+  public String toString() {
+    StringBuilder sb = new StringBuilder();
+    sb.append("class GenericResourceApiOnapmodelinformationOnapModelInformation {\n");
+    
+    sb.append("    modelName: ").append(toIndentedString(modelName)).append("\n");
+    sb.append("    modelVersion: ").append(toIndentedString(modelVersion)).append("\n");
+    sb.append("    modelCustomizationUuid: ").append(toIndentedString(modelCustomizationUuid)).append("\n");
+    sb.append("    modelUuid: ").append(toIndentedString(modelUuid)).append("\n");
+    sb.append("    modelInvariantUuid: ").append(toIndentedString(modelInvariantUuid)).append("\n");
+    sb.append("}");
+    return sb.toString();
+  }
+
+  /**
+   * Convert the given object to string with each line indented by 4 spaces
+   * (except the first line).
+   */
+  private String toIndentedString(java.lang.Object o) {
+    if (o == null) {
+      return "null";
+    }
+    return o.toString().replace("\n", "\n    ");
+  }
+}
+
diff --git a/ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/swagger/model/GenericResourceApiOperStatusData.java b/ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/swagger/model/GenericResourceApiOperStatusData.java
new file mode 100644 (file)
index 0000000..e07c4db
--- /dev/null
@@ -0,0 +1,237 @@
+package org.onap.sdnc.apps.ms.gra.swagger.model;
+
+import java.util.Objects;
+
+import javax.validation.Valid;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonRootName;
+
+import org.springframework.validation.annotation.Validated;
+
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * GenericResourceApiOperStatusData
+ */
+@Validated
+@javax.annotation.Generated(value = "io.swagger.codegen.languages.SpringCodegen", date = "2021-07-23T12:02:01.518-04:00")
+@JsonRootName("oper-status")
+public class GenericResourceApiOperStatusData   {
+  @JsonProperty("last-action")
+  private GenericResourceApiLastActionEnumeration lastAction = null;
+
+  @JsonProperty("modify-timestamp")
+  private String modifyTimestamp = null;
+
+  @JsonProperty("last-order-status")
+  private GenericResourceApiLastOrderStatusEnumeration lastOrderStatus = null;
+
+  @JsonProperty("create-timestamp")
+  private String createTimestamp = null;
+
+  @JsonProperty("order-status")
+  private GenericResourceApiOrderStatusEnumeration orderStatus = null;
+
+  @JsonProperty("last-rpc-action")
+  private GenericResourceApiLastRpcActionEnumeration lastRpcAction = null;
+
+  @JsonProperty("last-svc-request-id")
+  private String lastSvcRequestId = null;
+
+  public GenericResourceApiOperStatusData lastAction(GenericResourceApiLastActionEnumeration lastAction) {
+    this.lastAction = lastAction;
+    return this;
+  }
+
+  /**
+   * should be list of possible request-actions
+   * @return lastAction
+  **/
+  @ApiModelProperty(value = "should be list of possible request-actions")
+
+  @Valid
+
+  public GenericResourceApiLastActionEnumeration getLastAction() {
+    return lastAction;
+  }
+
+  public void setLastAction(GenericResourceApiLastActionEnumeration lastAction) {
+    this.lastAction = lastAction;
+  }
+
+  public GenericResourceApiOperStatusData modifyTimestamp(String modifyTimestamp) {
+    this.modifyTimestamp = modifyTimestamp;
+    return this;
+  }
+
+  /**
+   * Get modifyTimestamp
+   * @return modifyTimestamp
+  **/
+  @ApiModelProperty(value = "")
+
+
+  public String getModifyTimestamp() {
+    return modifyTimestamp;
+  }
+
+  public void setModifyTimestamp(String modifyTimestamp) {
+    this.modifyTimestamp = modifyTimestamp;
+  }
+
+  public GenericResourceApiOperStatusData lastOrderStatus(GenericResourceApiLastOrderStatusEnumeration lastOrderStatus) {
+    this.lastOrderStatus = lastOrderStatus;
+    return this;
+  }
+
+  /**
+   * Get lastOrderStatus
+   * @return lastOrderStatus
+  **/
+  @ApiModelProperty(value = "")
+
+  @Valid
+
+  public GenericResourceApiLastOrderStatusEnumeration getLastOrderStatus() {
+    return lastOrderStatus;
+  }
+
+  public void setLastOrderStatus(GenericResourceApiLastOrderStatusEnumeration lastOrderStatus) {
+    this.lastOrderStatus = lastOrderStatus;
+  }
+
+  public GenericResourceApiOperStatusData createTimestamp(String createTimestamp) {
+    this.createTimestamp = createTimestamp;
+    return this;
+  }
+
+  /**
+   * Not currently populated in service data.
+   * @return createTimestamp
+  **/
+  @ApiModelProperty(value = "Not currently populated in service data.")
+
+
+  public String getCreateTimestamp() {
+    return createTimestamp;
+  }
+
+  public void setCreateTimestamp(String createTimestamp) {
+    this.createTimestamp = createTimestamp;
+  }
+
+  public GenericResourceApiOperStatusData orderStatus(GenericResourceApiOrderStatusEnumeration orderStatus) {
+    this.orderStatus = orderStatus;
+    return this;
+  }
+
+  /**
+   * TBD - do we need Request failed statuses? RequestFailed | InProgressTimeout
+   * @return orderStatus
+  **/
+  @ApiModelProperty(value = "TBD - do we need Request failed statuses? RequestFailed | InProgressTimeout")
+
+  @Valid
+
+  public GenericResourceApiOrderStatusEnumeration getOrderStatus() {
+    return orderStatus;
+  }
+
+  public void setOrderStatus(GenericResourceApiOrderStatusEnumeration orderStatus) {
+    this.orderStatus = orderStatus;
+  }
+
+  public GenericResourceApiOperStatusData lastRpcAction(GenericResourceApiLastRpcActionEnumeration lastRpcAction) {
+    this.lastRpcAction = lastRpcAction;
+    return this;
+  }
+
+  /**
+   * Get lastRpcAction
+   * @return lastRpcAction
+  **/
+  @ApiModelProperty(value = "")
+
+  @Valid
+
+  public GenericResourceApiLastRpcActionEnumeration getLastRpcAction() {
+    return lastRpcAction;
+  }
+
+  public void setLastRpcAction(GenericResourceApiLastRpcActionEnumeration lastRpcAction) {
+    this.lastRpcAction = lastRpcAction;
+  }
+
+  public GenericResourceApiOperStatusData lastSvcRequestId(String lastSvcRequestId) {
+    this.lastSvcRequestId = lastSvcRequestId;
+    return this;
+  }
+
+  /**
+   * Not currently populated in service data.
+   * @return lastSvcRequestId
+  **/
+  @ApiModelProperty(value = "Not currently populated in service data.")
+
+
+  public String getLastSvcRequestId() {
+    return lastSvcRequestId;
+  }
+
+  public void setLastSvcRequestId(String lastSvcRequestId) {
+    this.lastSvcRequestId = lastSvcRequestId;
+  }
+
+
+  @Override
+  public boolean equals(java.lang.Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    GenericResourceApiOperStatusData genericResourceApiOperStatusData = (GenericResourceApiOperStatusData) o;
+    return Objects.equals(this.lastAction, genericResourceApiOperStatusData.lastAction) &&
+        Objects.equals(this.modifyTimestamp, genericResourceApiOperStatusData.modifyTimestamp) &&
+        Objects.equals(this.lastOrderStatus, genericResourceApiOperStatusData.lastOrderStatus) &&
+        Objects.equals(this.createTimestamp, genericResourceApiOperStatusData.createTimestamp) &&
+        Objects.equals(this.orderStatus, genericResourceApiOperStatusData.orderStatus) &&
+        Objects.equals(this.lastRpcAction, genericResourceApiOperStatusData.lastRpcAction) &&
+        Objects.equals(this.lastSvcRequestId, genericResourceApiOperStatusData.lastSvcRequestId);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(lastAction, modifyTimestamp, lastOrderStatus, createTimestamp, orderStatus, lastRpcAction, lastSvcRequestId);
+  }
+
+  @Override
+  public String toString() {
+    StringBuilder sb = new StringBuilder();
+    sb.append("class GenericResourceApiOperStatusData {\n");
+    
+    sb.append("    lastAction: ").append(toIndentedString(lastAction)).append("\n");
+    sb.append("    modifyTimestamp: ").append(toIndentedString(modifyTimestamp)).append("\n");
+    sb.append("    lastOrderStatus: ").append(toIndentedString(lastOrderStatus)).append("\n");
+    sb.append("    createTimestamp: ").append(toIndentedString(createTimestamp)).append("\n");
+    sb.append("    orderStatus: ").append(toIndentedString(orderStatus)).append("\n");
+    sb.append("    lastRpcAction: ").append(toIndentedString(lastRpcAction)).append("\n");
+    sb.append("    lastSvcRequestId: ").append(toIndentedString(lastSvcRequestId)).append("\n");
+    sb.append("}");
+    return sb.toString();
+  }
+
+  /**
+   * Convert the given object to string with each line indented by 4 spaces
+   * (except the first line).
+   */
+  private String toIndentedString(java.lang.Object o) {
+    if (o == null) {
+      return "null";
+    }
+    return o.toString().replace("\n", "\n    ");
+  }
+}
+
diff --git a/ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/swagger/model/GenericResourceApiPortMirrorConfigurations.java b/ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/swagger/model/GenericResourceApiPortMirrorConfigurations.java
new file mode 100644 (file)
index 0000000..86b6dc1
--- /dev/null
@@ -0,0 +1,95 @@
+package org.onap.sdnc.apps.ms.gra.swagger.model;
+
+import java.util.Objects;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonRootName;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import java.util.ArrayList;
+import java.util.List;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiPortmirrorconfigurationsPortMirrorConfiguration;
+import org.springframework.validation.annotation.Validated;
+import javax.validation.Valid;
+import javax.validation.constraints.*;
+
+/**
+ * GenericResourceApiPortMirrorConfigurations
+ */
+@Validated
+@javax.annotation.Generated(value = "io.swagger.codegen.languages.SpringCodegen", date = "2021-07-26T14:28:03.605-04:00")
+@JsonRootName("port-mirror-configurations")
+public class GenericResourceApiPortMirrorConfigurations   {
+  @JsonProperty("port-mirror-configuration")
+  @Valid
+  private List<GenericResourceApiPortmirrorconfigurationsPortMirrorConfiguration> portMirrorConfiguration = null;
+
+  public GenericResourceApiPortMirrorConfigurations portMirrorConfiguration(List<GenericResourceApiPortmirrorconfigurationsPortMirrorConfiguration> portMirrorConfiguration) {
+    this.portMirrorConfiguration = portMirrorConfiguration;
+    return this;
+  }
+
+  public GenericResourceApiPortMirrorConfigurations addPortMirrorConfigurationItem(GenericResourceApiPortmirrorconfigurationsPortMirrorConfiguration portMirrorConfigurationItem) {
+    if (this.portMirrorConfiguration == null) {
+      this.portMirrorConfiguration = new ArrayList<>();
+    }
+    this.portMirrorConfiguration.add(portMirrorConfigurationItem);
+    return this;
+  }
+
+  /**
+   * Get portMirrorConfiguration
+   * @return portMirrorConfiguration
+  **/
+  @ApiModelProperty(value = "")
+
+  @Valid
+
+  public List<GenericResourceApiPortmirrorconfigurationsPortMirrorConfiguration> getPortMirrorConfiguration() {
+    return portMirrorConfiguration;
+  }
+
+  public void setPortMirrorConfiguration(List<GenericResourceApiPortmirrorconfigurationsPortMirrorConfiguration> portMirrorConfiguration) {
+    this.portMirrorConfiguration = portMirrorConfiguration;
+  }
+
+
+  @Override
+  public boolean equals(java.lang.Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    GenericResourceApiPortMirrorConfigurations genericResourceApiPortMirrorConfigurations = (GenericResourceApiPortMirrorConfigurations) o;
+    return Objects.equals(this.portMirrorConfiguration, genericResourceApiPortMirrorConfigurations.portMirrorConfiguration);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(portMirrorConfiguration);
+  }
+
+  @Override
+  public String toString() {
+    StringBuilder sb = new StringBuilder();
+    sb.append("class GenericResourceApiPortMirrorConfigurations {\n");
+    
+    sb.append("    portMirrorConfiguration: ").append(toIndentedString(portMirrorConfiguration)).append("\n");
+    sb.append("}");
+    return sb.toString();
+  }
+
+  /**
+   * Convert the given object to string with each line indented by 4 spaces
+   * (except the first line).
+   */
+  private String toIndentedString(java.lang.Object o) {
+    if (o == null) {
+      return "null";
+    }
+    return o.toString().replace("\n", "\n    ");
+  }
+}
+
diff --git a/ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/swagger/model/GenericResourceApiPortmirrorconfigurationsPortMirrorConfiguration.java b/ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/swagger/model/GenericResourceApiPortmirrorconfigurationsPortMirrorConfiguration.java
new file mode 100644 (file)
index 0000000..ee7ab77
--- /dev/null
@@ -0,0 +1,137 @@
+package org.onap.sdnc.apps.ms.gra.swagger.model;
+
+import java.util.Objects;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonRootName;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiConfigurationStatus;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiConfigurationstatusConfigurationStatus;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiPortmirrorconfigurationsPortmirrorconfigurationConfigurationData;
+import org.springframework.validation.annotation.Validated;
+import javax.validation.Valid;
+import javax.validation.constraints.*;
+
+/**
+ * GenericResourceApiPortmirrorconfigurationsPortMirrorConfiguration
+ */
+@Validated
+@javax.annotation.Generated(value = "io.swagger.codegen.languages.SpringCodegen", date = "2021-07-13T13:26:44.236-04:00")
+@JsonRootName("port-mirror-configuration")
+public class GenericResourceApiPortmirrorconfigurationsPortMirrorConfiguration   {
+  @JsonProperty("configuration-status")
+  private GenericResourceApiConfigurationstatusConfigurationStatus configurationStatus = null;
+
+  @JsonProperty("configuration-id")
+  private String configurationId = null;
+
+  @JsonProperty("configuration-data")
+  private GenericResourceApiPortmirrorconfigurationsPortmirrorconfigurationConfigurationData configurationData = null;
+
+  public GenericResourceApiPortmirrorconfigurationsPortMirrorConfiguration configurationStatus(GenericResourceApiConfigurationstatusConfigurationStatus configurationStatus) {
+    this.configurationStatus = configurationStatus;
+    return this;
+  }
+
+  /**
+   * Get configurationStatus
+   * @return configurationStatus
+  **/
+  @ApiModelProperty(value = "")
+
+  @Valid
+
+  public GenericResourceApiConfigurationstatusConfigurationStatus getConfigurationStatus() {
+    return configurationStatus;
+  }
+
+  public void setConfigurationStatus(GenericResourceApiConfigurationstatusConfigurationStatus configurationStatus) {
+    this.configurationStatus = configurationStatus;
+  }
+
+  public GenericResourceApiPortmirrorconfigurationsPortMirrorConfiguration configurationId(String configurationId) {
+    this.configurationId = configurationId;
+    return this;
+  }
+
+  /**
+   * Get configurationId
+   * @return configurationId
+  **/
+  @ApiModelProperty(value = "")
+
+
+  public String getConfigurationId() {
+    return configurationId;
+  }
+
+  public void setConfigurationId(String configurationId) {
+    this.configurationId = configurationId;
+  }
+
+  public GenericResourceApiPortmirrorconfigurationsPortMirrorConfiguration configurationData(GenericResourceApiPortmirrorconfigurationsPortmirrorconfigurationConfigurationData configurationData) {
+    this.configurationData = configurationData;
+    return this;
+  }
+
+  /**
+   * Get configurationData
+   * @return configurationData
+  **/
+  @ApiModelProperty(value = "")
+
+  @Valid
+
+  public GenericResourceApiPortmirrorconfigurationsPortmirrorconfigurationConfigurationData getConfigurationData() {
+    return configurationData;
+  }
+
+  public void setConfigurationData(GenericResourceApiPortmirrorconfigurationsPortmirrorconfigurationConfigurationData configurationData) {
+    this.configurationData = configurationData;
+  }
+
+
+  @Override
+  public boolean equals(java.lang.Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    GenericResourceApiPortmirrorconfigurationsPortMirrorConfiguration genericResourceApiPortmirrorconfigurationsPortMirrorConfiguration = (GenericResourceApiPortmirrorconfigurationsPortMirrorConfiguration) o;
+    return Objects.equals(this.configurationStatus, genericResourceApiPortmirrorconfigurationsPortMirrorConfiguration.configurationStatus) &&
+        Objects.equals(this.configurationId, genericResourceApiPortmirrorconfigurationsPortMirrorConfiguration.configurationId) &&
+        Objects.equals(this.configurationData, genericResourceApiPortmirrorconfigurationsPortMirrorConfiguration.configurationData);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(configurationStatus, configurationId, configurationData);
+  }
+
+  @Override
+  public String toString() {
+    StringBuilder sb = new StringBuilder();
+    sb.append("class GenericResourceApiPortmirrorconfigurationsPortMirrorConfiguration {\n");
+    
+    sb.append("    configurationStatus: ").append(toIndentedString(configurationStatus)).append("\n");
+    sb.append("    configurationId: ").append(toIndentedString(configurationId)).append("\n");
+    sb.append("    configurationData: ").append(toIndentedString(configurationData)).append("\n");
+    sb.append("}");
+    return sb.toString();
+  }
+
+  /**
+   * Convert the given object to string with each line indented by 4 spaces
+   * (except the first line).
+   */
+  private String toIndentedString(java.lang.Object o) {
+    if (o == null) {
+      return "null";
+    }
+    return o.toString().replace("\n", "\n    ");
+  }
+}
+
diff --git a/ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/swagger/model/GenericResourceApiPortmirrorconfigurationtopologyPortMirrorConfigurationTopology.java b/ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/swagger/model/GenericResourceApiPortmirrorconfigurationtopologyPortMirrorConfigurationTopology.java
new file mode 100644 (file)
index 0000000..a855906
--- /dev/null
@@ -0,0 +1,168 @@
+package org.onap.sdnc.apps.ms.gra.swagger.model;
+
+import java.util.Objects;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonRootName;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiConfigurationIdentifiers;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiConfigurationidentifiersConfigurationIdentifiers;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiOnapModelInformation;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiOnapmodelinformationOnapModelInformation;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiParam;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiPortMirrorConfigurationAssignments;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiPortmirrorconfigurationassignmentsPortMirrorConfigurationAssignments;
+import org.springframework.validation.annotation.Validated;
+import javax.validation.Valid;
+import javax.validation.constraints.*;
+
+/**
+ * GenericResourceApiPortmirrorconfigurationtopologyPortMirrorConfigurationTopology
+ */
+@Validated
+@javax.annotation.Generated(value = "io.swagger.codegen.languages.SpringCodegen", date = "2021-07-13T13:26:44.236-04:00")
+@JsonRootName("port-mirror-configuration-topology")
+public class GenericResourceApiPortmirrorconfigurationtopologyPortMirrorConfigurationTopology   {
+  @JsonProperty("configuration-identifiers")
+  private GenericResourceApiConfigurationidentifiersConfigurationIdentifiers configurationIdentifiers = null;
+
+  @JsonProperty("onap-model-information")
+  private GenericResourceApiOnapmodelinformationOnapModelInformation onapModelInformation = null;
+
+  @JsonProperty("port-mirror-configuration-assignments")
+  private GenericResourceApiPortmirrorconfigurationassignmentsPortMirrorConfigurationAssignments portMirrorConfigurationAssignments = null;
+
+  @JsonProperty("port-mirror-configuration-parameters")
+  private GenericResourceApiParam portMirrorConfigurationParameters = null;
+
+  public GenericResourceApiPortmirrorconfigurationtopologyPortMirrorConfigurationTopology configurationIdentifiers(GenericResourceApiConfigurationidentifiersConfigurationIdentifiers configurationIdentifiers) {
+    this.configurationIdentifiers = configurationIdentifiers;
+    return this;
+  }
+
+  /**
+   * Get configurationIdentifiers
+   * @return configurationIdentifiers
+  **/
+  @ApiModelProperty(value = "")
+
+  @Valid
+
+  public GenericResourceApiConfigurationidentifiersConfigurationIdentifiers getConfigurationIdentifiers() {
+    return configurationIdentifiers;
+  }
+
+  public void setConfigurationIdentifiers(GenericResourceApiConfigurationidentifiersConfigurationIdentifiers configurationIdentifiers) {
+    this.configurationIdentifiers = configurationIdentifiers;
+  }
+
+  public GenericResourceApiPortmirrorconfigurationtopologyPortMirrorConfigurationTopology onapModelInformation(GenericResourceApiOnapmodelinformationOnapModelInformation onapModelInformation) {
+    this.onapModelInformation = onapModelInformation;
+    return this;
+  }
+
+  /**
+   * Get onapModelInformation
+   * @return onapModelInformation
+  **/
+  @ApiModelProperty(value = "")
+
+  @Valid
+
+  public GenericResourceApiOnapmodelinformationOnapModelInformation getOnapModelInformation() {
+    return onapModelInformation;
+  }
+
+  public void setOnapModelInformation(GenericResourceApiOnapmodelinformationOnapModelInformation onapModelInformation) {
+    this.onapModelInformation = onapModelInformation;
+  }
+
+  public GenericResourceApiPortmirrorconfigurationtopologyPortMirrorConfigurationTopology portMirrorConfigurationAssignments(GenericResourceApiPortmirrorconfigurationassignmentsPortMirrorConfigurationAssignments portMirrorConfigurationAssignments) {
+    this.portMirrorConfigurationAssignments = portMirrorConfigurationAssignments;
+    return this;
+  }
+
+  /**
+   * Get portMirrorConfigurationAssignments
+   * @return portMirrorConfigurationAssignments
+  **/
+  @ApiModelProperty(value = "")
+
+  @Valid
+
+  public GenericResourceApiPortmirrorconfigurationassignmentsPortMirrorConfigurationAssignments getPortMirrorConfigurationAssignments() {
+    return portMirrorConfigurationAssignments;
+  }
+
+  public void setPortMirrorConfigurationAssignments(GenericResourceApiPortmirrorconfigurationassignmentsPortMirrorConfigurationAssignments portMirrorConfigurationAssignments) {
+    this.portMirrorConfigurationAssignments = portMirrorConfigurationAssignments;
+  }
+
+  public GenericResourceApiPortmirrorconfigurationtopologyPortMirrorConfigurationTopology portMirrorConfigurationParameters(GenericResourceApiParam portMirrorConfigurationParameters) {
+    this.portMirrorConfigurationParameters = portMirrorConfigurationParameters;
+    return this;
+  }
+
+  /**
+   * Get portMirrorConfigurationParameters
+   * @return portMirrorConfigurationParameters
+  **/
+  @ApiModelProperty(value = "")
+
+  @Valid
+
+  public GenericResourceApiParam getPortMirrorConfigurationParameters() {
+    return portMirrorConfigurationParameters;
+  }
+
+  public void setPortMirrorConfigurationParameters(GenericResourceApiParam portMirrorConfigurationParameters) {
+    this.portMirrorConfigurationParameters = portMirrorConfigurationParameters;
+  }
+
+
+  @Override
+  public boolean equals(java.lang.Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    GenericResourceApiPortmirrorconfigurationtopologyPortMirrorConfigurationTopology genericResourceApiPortmirrorconfigurationtopologyPortMirrorConfigurationTopology = (GenericResourceApiPortmirrorconfigurationtopologyPortMirrorConfigurationTopology) o;
+    return Objects.equals(this.configurationIdentifiers, genericResourceApiPortmirrorconfigurationtopologyPortMirrorConfigurationTopology.configurationIdentifiers) &&
+        Objects.equals(this.onapModelInformation, genericResourceApiPortmirrorconfigurationtopologyPortMirrorConfigurationTopology.onapModelInformation) &&
+        Objects.equals(this.portMirrorConfigurationAssignments, genericResourceApiPortmirrorconfigurationtopologyPortMirrorConfigurationTopology.portMirrorConfigurationAssignments) &&
+        Objects.equals(this.portMirrorConfigurationParameters, genericResourceApiPortmirrorconfigurationtopologyPortMirrorConfigurationTopology.portMirrorConfigurationParameters);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(configurationIdentifiers, onapModelInformation, portMirrorConfigurationAssignments, portMirrorConfigurationParameters);
+  }
+
+  @Override
+  public String toString() {
+    StringBuilder sb = new StringBuilder();
+    sb.append("class GenericResourceApiPortmirrorconfigurationtopologyPortMirrorConfigurationTopology {\n");
+    
+    sb.append("    configurationIdentifiers: ").append(toIndentedString(configurationIdentifiers)).append("\n");
+    sb.append("    onapModelInformation: ").append(toIndentedString(onapModelInformation)).append("\n");
+    sb.append("    portMirrorConfigurationAssignments: ").append(toIndentedString(portMirrorConfigurationAssignments)).append("\n");
+    sb.append("    portMirrorConfigurationParameters: ").append(toIndentedString(portMirrorConfigurationParameters)).append("\n");
+    sb.append("}");
+    return sb.toString();
+  }
+
+  /**
+   * Convert the given object to string with each line indented by 4 spaces
+   * (except the first line).
+   */
+  private String toIndentedString(java.lang.Object o) {
+    if (o == null) {
+      return "null";
+    }
+    return o.toString().replace("\n", "\n    ");
+  }
+}
+
diff --git a/ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/swagger/model/GenericResourceApiPreloadModelInformation.java b/ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/swagger/model/GenericResourceApiPreloadModelInformation.java
new file mode 100644 (file)
index 0000000..c9b443b
--- /dev/null
@@ -0,0 +1,95 @@
+package org.onap.sdnc.apps.ms.gra.swagger.model;
+
+import java.util.Objects;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonRootName;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import java.util.ArrayList;
+import java.util.List;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiPreloadmodelinformationPreloadList;
+import org.springframework.validation.annotation.Validated;
+import javax.validation.Valid;
+import javax.validation.constraints.*;
+
+/**
+ * GenericResourceApiPreloadModelInformation
+ */
+@Validated
+@javax.annotation.Generated(value = "io.swagger.codegen.languages.SpringCodegen", date = "2021-07-13T13:26:44.236-04:00")
+@JsonRootName("preload-information")
+public class GenericResourceApiPreloadModelInformation   {
+  @JsonProperty("preload-list")
+  @Valid
+  private List<GenericResourceApiPreloadmodelinformationPreloadList> preloadList = null;
+
+  public GenericResourceApiPreloadModelInformation preloadList(List<GenericResourceApiPreloadmodelinformationPreloadList> preloadList) {
+    this.preloadList = preloadList;
+    return this;
+  }
+
+  public GenericResourceApiPreloadModelInformation addPreloadListItem(GenericResourceApiPreloadmodelinformationPreloadList preloadListItem) {
+    if (this.preloadList == null) {
+      this.preloadList = new ArrayList<>();
+    }
+    this.preloadList.add(preloadListItem);
+    return this;
+  }
+
+  /**
+   * Get preloadList
+   * @return preloadList
+  **/
+  @ApiModelProperty(value = "")
+
+  @Valid
+
+  public List<GenericResourceApiPreloadmodelinformationPreloadList> getPreloadList() {
+    return preloadList;
+  }
+
+  public void setPreloadList(List<GenericResourceApiPreloadmodelinformationPreloadList> preloadList) {
+    this.preloadList = preloadList;
+  }
+
+
+  @Override
+  public boolean equals(java.lang.Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    GenericResourceApiPreloadModelInformation genericResourceApiPreloadModelInformation = (GenericResourceApiPreloadModelInformation) o;
+    return Objects.equals(this.preloadList, genericResourceApiPreloadModelInformation.preloadList);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(preloadList);
+  }
+
+  @Override
+  public String toString() {
+    StringBuilder sb = new StringBuilder();
+    sb.append("class GenericResourceApiPreloadModelInformation {\n");
+    
+    sb.append("    preloadList: ").append(toIndentedString(preloadList)).append("\n");
+    sb.append("}");
+    return sb.toString();
+  }
+
+  /**
+   * Convert the given object to string with each line indented by 4 spaces
+   * (except the first line).
+   */
+  private String toIndentedString(java.lang.Object o) {
+    if (o == null) {
+      return "null";
+    }
+    return o.toString().replace("\n", "\n    ");
+  }
+}
+
diff --git a/ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/swagger/model/GenericResourceApiPreloaddataPreloadData.java b/ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/swagger/model/GenericResourceApiPreloaddataPreloadData.java
new file mode 100644 (file)
index 0000000..a6a4c9d
--- /dev/null
@@ -0,0 +1,141 @@
+package org.onap.sdnc.apps.ms.gra.swagger.model;
+
+import java.util.Objects;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonRootName;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiPreloadNetworkTopologyInformation;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiPreloadOperStatus;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiPreloadVfModuleTopologyInformation;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiPreloadnetworktopologyinformationPreloadNetworkTopologyInformation;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiPreloadoperstatusPreloadOperStatus;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiPreloadvfmoduletopologyinformationPreloadVfModuleTopologyInformation;
+import org.springframework.validation.annotation.Validated;
+import javax.validation.Valid;
+import javax.validation.constraints.*;
+
+/**
+ * GenericResourceApiPreloaddataPreloadData
+ */
+@Validated
+@javax.annotation.Generated(value = "io.swagger.codegen.languages.SpringCodegen", date = "2021-07-13T13:26:44.236-04:00")
+@JsonRootName("preload-data")
+public class GenericResourceApiPreloaddataPreloadData   {
+  @JsonProperty("preload-network-topology-information")
+  private GenericResourceApiPreloadnetworktopologyinformationPreloadNetworkTopologyInformation preloadNetworkTopologyInformation = null;
+
+  @JsonProperty("preload-oper-status")
+  private GenericResourceApiPreloadoperstatusPreloadOperStatus preloadOperStatus = null;
+
+  @JsonProperty("preload-vf-module-topology-information")
+  private GenericResourceApiPreloadvfmoduletopologyinformationPreloadVfModuleTopologyInformation preloadVfModuleTopologyInformation = null;
+
+  public GenericResourceApiPreloaddataPreloadData preloadNetworkTopologyInformation(GenericResourceApiPreloadnetworktopologyinformationPreloadNetworkTopologyInformation preloadNetworkTopologyInformation) {
+    this.preloadNetworkTopologyInformation = preloadNetworkTopologyInformation;
+    return this;
+  }
+
+  /**
+   * Get preloadNetworkTopologyInformation
+   * @return preloadNetworkTopologyInformation
+  **/
+  @ApiModelProperty(value = "")
+
+  @Valid
+
+  public GenericResourceApiPreloadnetworktopologyinformationPreloadNetworkTopologyInformation getPreloadNetworkTopologyInformation() {
+    return preloadNetworkTopologyInformation;
+  }
+
+  public void setPreloadNetworkTopologyInformation(GenericResourceApiPreloadnetworktopologyinformationPreloadNetworkTopologyInformation preloadNetworkTopologyInformation) {
+    this.preloadNetworkTopologyInformation = preloadNetworkTopologyInformation;
+  }
+
+  public GenericResourceApiPreloaddataPreloadData preloadOperStatus(GenericResourceApiPreloadoperstatusPreloadOperStatus preloadOperStatus) {
+    this.preloadOperStatus = preloadOperStatus;
+    return this;
+  }
+
+  /**
+   * Get preloadOperStatus
+   * @return preloadOperStatus
+  **/
+  @ApiModelProperty(value = "")
+
+  @Valid
+
+  public GenericResourceApiPreloadoperstatusPreloadOperStatus getPreloadOperStatus() {
+    return preloadOperStatus;
+  }
+
+  public void setPreloadOperStatus(GenericResourceApiPreloadoperstatusPreloadOperStatus preloadOperStatus) {
+    this.preloadOperStatus = preloadOperStatus;
+  }
+
+  public GenericResourceApiPreloaddataPreloadData preloadVfModuleTopologyInformation(GenericResourceApiPreloadvfmoduletopologyinformationPreloadVfModuleTopologyInformation preloadVfModuleTopologyInformation) {
+    this.preloadVfModuleTopologyInformation = preloadVfModuleTopologyInformation;
+    return this;
+  }
+
+  /**
+   * Get preloadVfModuleTopologyInformation
+   * @return preloadVfModuleTopologyInformation
+  **/
+  @ApiModelProperty(value = "")
+
+  @Valid
+
+  public GenericResourceApiPreloadvfmoduletopologyinformationPreloadVfModuleTopologyInformation getPreloadVfModuleTopologyInformation() {
+    return preloadVfModuleTopologyInformation;
+  }
+
+  public void setPreloadVfModuleTopologyInformation(GenericResourceApiPreloadvfmoduletopologyinformationPreloadVfModuleTopologyInformation preloadVfModuleTopologyInformation) {
+    this.preloadVfModuleTopologyInformation = preloadVfModuleTopologyInformation;
+  }
+
+
+  @Override
+  public boolean equals(java.lang.Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    GenericResourceApiPreloaddataPreloadData genericResourceApiPreloaddataPreloadData = (GenericResourceApiPreloaddataPreloadData) o;
+    return Objects.equals(this.preloadNetworkTopologyInformation, genericResourceApiPreloaddataPreloadData.preloadNetworkTopologyInformation) &&
+        Objects.equals(this.preloadOperStatus, genericResourceApiPreloaddataPreloadData.preloadOperStatus) &&
+        Objects.equals(this.preloadVfModuleTopologyInformation, genericResourceApiPreloaddataPreloadData.preloadVfModuleTopologyInformation);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(preloadNetworkTopologyInformation, preloadOperStatus, preloadVfModuleTopologyInformation);
+  }
+
+  @Override
+  public String toString() {
+    StringBuilder sb = new StringBuilder();
+    sb.append("class GenericResourceApiPreloaddataPreloadData {\n");
+    
+    sb.append("    preloadNetworkTopologyInformation: ").append(toIndentedString(preloadNetworkTopologyInformation)).append("\n");
+    sb.append("    preloadOperStatus: ").append(toIndentedString(preloadOperStatus)).append("\n");
+    sb.append("    preloadVfModuleTopologyInformation: ").append(toIndentedString(preloadVfModuleTopologyInformation)).append("\n");
+    sb.append("}");
+    return sb.toString();
+  }
+
+  /**
+   * Convert the given object to string with each line indented by 4 spaces
+   * (except the first line).
+   */
+  private String toIndentedString(java.lang.Object o) {
+    if (o == null) {
+      return "null";
+    }
+    return o.toString().replace("\n", "\n    ");
+  }
+}
+
diff --git a/ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/swagger/model/GenericResourceApiPreloadmodelinformationPreloadList.java b/ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/swagger/model/GenericResourceApiPreloadmodelinformationPreloadList.java
new file mode 100644 (file)
index 0000000..7774395
--- /dev/null
@@ -0,0 +1,135 @@
+package org.onap.sdnc.apps.ms.gra.swagger.model;
+
+import java.util.Objects;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonRootName;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiPreloadData;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiPreloaddataPreloadData;
+import org.springframework.validation.annotation.Validated;
+import javax.validation.Valid;
+import javax.validation.constraints.*;
+
+/**
+ * GenericResourceApiPreloadmodelinformationPreloadList
+ */
+@Validated
+@javax.annotation.Generated(value = "io.swagger.codegen.languages.SpringCodegen", date = "2021-07-13T13:26:44.236-04:00")
+@JsonRootName("preload-list")
+public class GenericResourceApiPreloadmodelinformationPreloadList   {
+  @JsonProperty("preload-data")
+  private GenericResourceApiPreloaddataPreloadData preloadData = null;
+
+  @JsonProperty("preload-type")
+  private String preloadType = null;
+
+  @JsonProperty("preload-id")
+  private String preloadId = null;
+
+  public GenericResourceApiPreloadmodelinformationPreloadList preloadData(GenericResourceApiPreloaddataPreloadData preloadData) {
+    this.preloadData = preloadData;
+    return this;
+  }
+
+  /**
+   * Get preloadData
+   * @return preloadData
+  **/
+  @ApiModelProperty(value = "")
+
+  @Valid
+
+  public GenericResourceApiPreloaddataPreloadData getPreloadData() {
+    return preloadData;
+  }
+
+  public void setPreloadData(GenericResourceApiPreloaddataPreloadData preloadData) {
+    this.preloadData = preloadData;
+  }
+
+  public GenericResourceApiPreloadmodelinformationPreloadList preloadType(String preloadType) {
+    this.preloadType = preloadType;
+    return this;
+  }
+
+  /**
+   * network or vf-module
+   * @return preloadType
+  **/
+  @ApiModelProperty(value = "network or vf-module")
+
+
+  public String getPreloadType() {
+    return preloadType;
+  }
+
+  public void setPreloadType(String preloadType) {
+    this.preloadType = preloadType;
+  }
+
+  public GenericResourceApiPreloadmodelinformationPreloadList preloadId(String preloadId) {
+    this.preloadId = preloadId;
+    return this;
+  }
+
+  /**
+   * vf-module-name or network name
+   * @return preloadId
+  **/
+  @ApiModelProperty(value = "vf-module-name or network name")
+
+
+  public String getPreloadId() {
+    return preloadId;
+  }
+
+  public void setPreloadId(String preloadId) {
+    this.preloadId = preloadId;
+  }
+
+
+  @Override
+  public boolean equals(java.lang.Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    GenericResourceApiPreloadmodelinformationPreloadList genericResourceApiPreloadmodelinformationPreloadList = (GenericResourceApiPreloadmodelinformationPreloadList) o;
+    return Objects.equals(this.preloadData, genericResourceApiPreloadmodelinformationPreloadList.preloadData) &&
+        Objects.equals(this.preloadType, genericResourceApiPreloadmodelinformationPreloadList.preloadType) &&
+        Objects.equals(this.preloadId, genericResourceApiPreloadmodelinformationPreloadList.preloadId);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(preloadData, preloadType, preloadId);
+  }
+
+  @Override
+  public String toString() {
+    StringBuilder sb = new StringBuilder();
+    sb.append("class GenericResourceApiPreloadmodelinformationPreloadList {\n");
+    
+    sb.append("    preloadData: ").append(toIndentedString(preloadData)).append("\n");
+    sb.append("    preloadType: ").append(toIndentedString(preloadType)).append("\n");
+    sb.append("    preloadId: ").append(toIndentedString(preloadId)).append("\n");
+    sb.append("}");
+    return sb.toString();
+  }
+
+  /**
+   * Convert the given object to string with each line indented by 4 spaces
+   * (except the first line).
+   */
+  private String toIndentedString(java.lang.Object o) {
+    if (o == null) {
+      return "null";
+    }
+    return o.toString().replace("\n", "\n    ");
+  }
+}
+
diff --git a/ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/swagger/model/GenericResourceApiPreloadnetworktopologyinformationPreloadNetworkTopologyInformation.java b/ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/swagger/model/GenericResourceApiPreloadnetworktopologyinformationPreloadNetworkTopologyInformation.java
new file mode 100644 (file)
index 0000000..de07732
--- /dev/null
@@ -0,0 +1,373 @@
+package org.onap.sdnc.apps.ms.gra.swagger.model;
+
+import java.util.Objects;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonRootName;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import java.util.ArrayList;
+import java.util.List;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiHostRoutes;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiHostroutesHostRoutes;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiNetworkPolicy;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiNetworkTopologyIdentifierStructure;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiNetworkpolicyNetworkPolicy;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiNetworktopologyidentifierstructureNetworkTopologyIdentifierStructure;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiProviderNetworkInformation;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiRouteTableReference;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiRoutetablereferenceRouteTableReference;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiSubnets;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiSubnetsSubnets;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiVpnBindings;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiVpnbindingsVpnBindings;
+import org.springframework.validation.annotation.Validated;
+import javax.validation.Valid;
+import javax.validation.constraints.*;
+
+/**
+ * GenericResourceApiPreloadnetworktopologyinformationPreloadNetworkTopologyInformation
+ */
+@Validated
+@javax.annotation.Generated(value = "io.swagger.codegen.languages.SpringCodegen", date = "2021-07-13T13:26:44.236-04:00")
+@JsonRootName("preload-network-topology-information")
+public class GenericResourceApiPreloadnetworktopologyinformationPreloadNetworkTopologyInformation   {
+  @JsonProperty("host-routes")
+  @Valid
+  private List<GenericResourceApiHostroutesHostRoutes> hostRoutes = null;
+
+  @JsonProperty("network-policy")
+  @Valid
+  private List<GenericResourceApiNetworkpolicyNetworkPolicy> networkPolicy = null;
+
+  @JsonProperty("network-topology-identifier-structure")
+  private GenericResourceApiNetworktopologyidentifierstructureNetworkTopologyIdentifierStructure networkTopologyIdentifierStructure = null;
+
+  @JsonProperty("physical-network-name")
+  private String physicalNetworkName = null;
+
+  @JsonProperty("is-external-network")
+  private Boolean isExternalNetwork = null;
+
+  @JsonProperty("is-shared-network")
+  private Boolean isSharedNetwork = null;
+
+  @JsonProperty("is-provider-network")
+  private Boolean isProviderNetwork = null;
+
+  @JsonProperty("route-table-reference")
+  @Valid
+  private List<GenericResourceApiRoutetablereferenceRouteTableReference> routeTableReference = null;
+
+  @JsonProperty("subnets")
+  @Valid
+  private List<GenericResourceApiSubnetsSubnets> subnets = null;
+
+  @JsonProperty("vpn-bindings")
+  @Valid
+  private List<GenericResourceApiVpnbindingsVpnBindings> vpnBindings = null;
+
+  public GenericResourceApiPreloadnetworktopologyinformationPreloadNetworkTopologyInformation hostRoutes(List<GenericResourceApiHostroutesHostRoutes> hostRoutes) {
+    this.hostRoutes = hostRoutes;
+    return this;
+  }
+
+  public GenericResourceApiPreloadnetworktopologyinformationPreloadNetworkTopologyInformation addHostRoutesItem(GenericResourceApiHostroutesHostRoutes hostRoutesItem) {
+    if (this.hostRoutes == null) {
+      this.hostRoutes = new ArrayList<>();
+    }
+    this.hostRoutes.add(hostRoutesItem);
+    return this;
+  }
+
+  /**
+   * Get hostRoutes
+   * @return hostRoutes
+  **/
+  @ApiModelProperty(value = "")
+
+  @Valid
+
+  public List<GenericResourceApiHostroutesHostRoutes> getHostRoutes() {
+    return hostRoutes;
+  }
+
+  public void setHostRoutes(List<GenericResourceApiHostroutesHostRoutes> hostRoutes) {
+    this.hostRoutes = hostRoutes;
+  }
+
+  public GenericResourceApiPreloadnetworktopologyinformationPreloadNetworkTopologyInformation networkPolicy(List<GenericResourceApiNetworkpolicyNetworkPolicy> networkPolicy) {
+    this.networkPolicy = networkPolicy;
+    return this;
+  }
+
+  public GenericResourceApiPreloadnetworktopologyinformationPreloadNetworkTopologyInformation addNetworkPolicyItem(GenericResourceApiNetworkpolicyNetworkPolicy networkPolicyItem) {
+    if (this.networkPolicy == null) {
+      this.networkPolicy = new ArrayList<>();
+    }
+    this.networkPolicy.add(networkPolicyItem);
+    return this;
+  }
+
+  /**
+   * Get networkPolicy
+   * @return networkPolicy
+  **/
+  @ApiModelProperty(value = "")
+
+  @Valid
+
+  public List<GenericResourceApiNetworkpolicyNetworkPolicy> getNetworkPolicy() {
+    return networkPolicy;
+  }
+
+  public void setNetworkPolicy(List<GenericResourceApiNetworkpolicyNetworkPolicy> networkPolicy) {
+    this.networkPolicy = networkPolicy;
+  }
+
+  public GenericResourceApiPreloadnetworktopologyinformationPreloadNetworkTopologyInformation networkTopologyIdentifierStructure(GenericResourceApiNetworktopologyidentifierstructureNetworkTopologyIdentifierStructure networkTopologyIdentifierStructure) {
+    this.networkTopologyIdentifierStructure = networkTopologyIdentifierStructure;
+    return this;
+  }
+
+  /**
+   * Get networkTopologyIdentifierStructure
+   * @return networkTopologyIdentifierStructure
+  **/
+  @ApiModelProperty(value = "")
+
+  @Valid
+
+  public GenericResourceApiNetworktopologyidentifierstructureNetworkTopologyIdentifierStructure getNetworkTopologyIdentifierStructure() {
+    return networkTopologyIdentifierStructure;
+  }
+
+  public void setNetworkTopologyIdentifierStructure(GenericResourceApiNetworktopologyidentifierstructureNetworkTopologyIdentifierStructure networkTopologyIdentifierStructure) {
+    this.networkTopologyIdentifierStructure = networkTopologyIdentifierStructure;
+  }
+
+  public GenericResourceApiPreloadnetworktopologyinformationPreloadNetworkTopologyInformation physicalNetworkName(String physicalNetworkName) {
+    this.physicalNetworkName = physicalNetworkName;
+    return this;
+  }
+
+  /**
+   * Get physicalNetworkName
+   * @return physicalNetworkName
+  **/
+  @ApiModelProperty(value = "")
+
+
+  public String getPhysicalNetworkName() {
+    return physicalNetworkName;
+  }
+
+  public void setPhysicalNetworkName(String physicalNetworkName) {
+    this.physicalNetworkName = physicalNetworkName;
+  }
+
+  public GenericResourceApiPreloadnetworktopologyinformationPreloadNetworkTopologyInformation isExternalNetwork(Boolean isExternalNetwork) {
+    this.isExternalNetwork = isExternalNetwork;
+    return this;
+  }
+
+  /**
+   * Get isExternalNetwork
+   * @return isExternalNetwork
+  **/
+  @ApiModelProperty(value = "")
+
+
+  public Boolean isIsExternalNetwork() {
+    return isExternalNetwork;
+  }
+
+  public void setIsExternalNetwork(Boolean isExternalNetwork) {
+    this.isExternalNetwork = isExternalNetwork;
+  }
+
+  public GenericResourceApiPreloadnetworktopologyinformationPreloadNetworkTopologyInformation isSharedNetwork(Boolean isSharedNetwork) {
+    this.isSharedNetwork = isSharedNetwork;
+    return this;
+  }
+
+  /**
+   * Get isSharedNetwork
+   * @return isSharedNetwork
+  **/
+  @ApiModelProperty(value = "")
+
+
+  public Boolean isIsSharedNetwork() {
+    return isSharedNetwork;
+  }
+
+  public void setIsSharedNetwork(Boolean isSharedNetwork) {
+    this.isSharedNetwork = isSharedNetwork;
+  }
+
+  public GenericResourceApiPreloadnetworktopologyinformationPreloadNetworkTopologyInformation isProviderNetwork(Boolean isProviderNetwork) {
+    this.isProviderNetwork = isProviderNetwork;
+    return this;
+  }
+
+  /**
+   * Get isProviderNetwork
+   * @return isProviderNetwork
+  **/
+  @ApiModelProperty(value = "")
+
+
+  public Boolean isIsProviderNetwork() {
+    return isProviderNetwork;
+  }
+
+  public void setIsProviderNetwork(Boolean isProviderNetwork) {
+    this.isProviderNetwork = isProviderNetwork;
+  }
+
+  public GenericResourceApiPreloadnetworktopologyinformationPreloadNetworkTopologyInformation routeTableReference(List<GenericResourceApiRoutetablereferenceRouteTableReference> routeTableReference) {
+    this.routeTableReference = routeTableReference;
+    return this;
+  }
+
+  public GenericResourceApiPreloadnetworktopologyinformationPreloadNetworkTopologyInformation addRouteTableReferenceItem(GenericResourceApiRoutetablereferenceRouteTableReference routeTableReferenceItem) {
+    if (this.routeTableReference == null) {
+      this.routeTableReference = new ArrayList<>();
+    }
+    this.routeTableReference.add(routeTableReferenceItem);
+    return this;
+  }
+
+  /**
+   * Get routeTableReference
+   * @return routeTableReference
+  **/
+  @ApiModelProperty(value = "")
+
+  @Valid
+
+  public List<GenericResourceApiRoutetablereferenceRouteTableReference> getRouteTableReference() {
+    return routeTableReference;
+  }
+
+  public void setRouteTableReference(List<GenericResourceApiRoutetablereferenceRouteTableReference> routeTableReference) {
+    this.routeTableReference = routeTableReference;
+  }
+
+  public GenericResourceApiPreloadnetworktopologyinformationPreloadNetworkTopologyInformation subnets(List<GenericResourceApiSubnetsSubnets> subnets) {
+    this.subnets = subnets;
+    return this;
+  }
+
+  public GenericResourceApiPreloadnetworktopologyinformationPreloadNetworkTopologyInformation addSubnetsItem(GenericResourceApiSubnetsSubnets subnetsItem) {
+    if (this.subnets == null) {
+      this.subnets = new ArrayList<>();
+    }
+    this.subnets.add(subnetsItem);
+    return this;
+  }
+
+  /**
+   * Get subnets
+   * @return subnets
+  **/
+  @ApiModelProperty(value = "")
+
+  @Valid
+
+  public List<GenericResourceApiSubnetsSubnets> getSubnets() {
+    return subnets;
+  }
+
+  public void setSubnets(List<GenericResourceApiSubnetsSubnets> subnets) {
+    this.subnets = subnets;
+  }
+
+  public GenericResourceApiPreloadnetworktopologyinformationPreloadNetworkTopologyInformation vpnBindings(List<GenericResourceApiVpnbindingsVpnBindings> vpnBindings) {
+    this.vpnBindings = vpnBindings;
+    return this;
+  }
+
+  public GenericResourceApiPreloadnetworktopologyinformationPreloadNetworkTopologyInformation addVpnBindingsItem(GenericResourceApiVpnbindingsVpnBindings vpnBindingsItem) {
+    if (this.vpnBindings == null) {
+      this.vpnBindings = new ArrayList<>();
+    }
+    this.vpnBindings.add(vpnBindingsItem);
+    return this;
+  }
+
+  /**
+   * Get vpnBindings
+   * @return vpnBindings
+  **/
+  @ApiModelProperty(value = "")
+
+  @Valid
+
+  public List<GenericResourceApiVpnbindingsVpnBindings> getVpnBindings() {
+    return vpnBindings;
+  }
+
+  public void setVpnBindings(List<GenericResourceApiVpnbindingsVpnBindings> vpnBindings) {
+    this.vpnBindings = vpnBindings;
+  }
+
+
+  @Override
+  public boolean equals(java.lang.Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    GenericResourceApiPreloadnetworktopologyinformationPreloadNetworkTopologyInformation genericResourceApiPreloadnetworktopologyinformationPreloadNetworkTopologyInformation = (GenericResourceApiPreloadnetworktopologyinformationPreloadNetworkTopologyInformation) o;
+    return Objects.equals(this.hostRoutes, genericResourceApiPreloadnetworktopologyinformationPreloadNetworkTopologyInformation.hostRoutes) &&
+        Objects.equals(this.networkPolicy, genericResourceApiPreloadnetworktopologyinformationPreloadNetworkTopologyInformation.networkPolicy) &&
+        Objects.equals(this.networkTopologyIdentifierStructure, genericResourceApiPreloadnetworktopologyinformationPreloadNetworkTopologyInformation.networkTopologyIdentifierStructure) &&
+        Objects.equals(this.physicalNetworkName, genericResourceApiPreloadnetworktopologyinformationPreloadNetworkTopologyInformation.physicalNetworkName) &&
+        Objects.equals(this.isExternalNetwork, genericResourceApiPreloadnetworktopologyinformationPreloadNetworkTopologyInformation.isExternalNetwork) &&
+        Objects.equals(this.isSharedNetwork, genericResourceApiPreloadnetworktopologyinformationPreloadNetworkTopologyInformation.isSharedNetwork) &&
+        Objects.equals(this.isProviderNetwork, genericResourceApiPreloadnetworktopologyinformationPreloadNetworkTopologyInformation.isProviderNetwork) &&
+        Objects.equals(this.routeTableReference, genericResourceApiPreloadnetworktopologyinformationPreloadNetworkTopologyInformation.routeTableReference) &&
+        Objects.equals(this.subnets, genericResourceApiPreloadnetworktopologyinformationPreloadNetworkTopologyInformation.subnets) &&
+        Objects.equals(this.vpnBindings, genericResourceApiPreloadnetworktopologyinformationPreloadNetworkTopologyInformation.vpnBindings);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(hostRoutes, networkPolicy, networkTopologyIdentifierStructure, physicalNetworkName, isExternalNetwork, isSharedNetwork, isProviderNetwork, routeTableReference, subnets, vpnBindings);
+  }
+
+  @Override
+  public String toString() {
+    StringBuilder sb = new StringBuilder();
+    sb.append("class GenericResourceApiPreloadnetworktopologyinformationPreloadNetworkTopologyInformation {\n");
+    
+    sb.append("    hostRoutes: ").append(toIndentedString(hostRoutes)).append("\n");
+    sb.append("    networkPolicy: ").append(toIndentedString(networkPolicy)).append("\n");
+    sb.append("    networkTopologyIdentifierStructure: ").append(toIndentedString(networkTopologyIdentifierStructure)).append("\n");
+    sb.append("    physicalNetworkName: ").append(toIndentedString(physicalNetworkName)).append("\n");
+    sb.append("    isExternalNetwork: ").append(toIndentedString(isExternalNetwork)).append("\n");
+    sb.append("    isSharedNetwork: ").append(toIndentedString(isSharedNetwork)).append("\n");
+    sb.append("    isProviderNetwork: ").append(toIndentedString(isProviderNetwork)).append("\n");
+    sb.append("    routeTableReference: ").append(toIndentedString(routeTableReference)).append("\n");
+    sb.append("    subnets: ").append(toIndentedString(subnets)).append("\n");
+    sb.append("    vpnBindings: ").append(toIndentedString(vpnBindings)).append("\n");
+    sb.append("}");
+    return sb.toString();
+  }
+
+  /**
+   * Convert the given object to string with each line indented by 4 spaces
+   * (except the first line).
+   */
+  private String toIndentedString(java.lang.Object o) {
+    if (o == null) {
+      return "null";
+    }
+    return o.toString().replace("\n", "\n    ");
+  }
+}
+
diff --git a/ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/swagger/model/GenericResourceApiServiceModelInfrastructure.java b/ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/swagger/model/GenericResourceApiServiceModelInfrastructure.java
new file mode 100644 (file)
index 0000000..2f3250e
--- /dev/null
@@ -0,0 +1,95 @@
+package org.onap.sdnc.apps.ms.gra.swagger.model;
+
+import java.util.Objects;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonRootName;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import java.util.ArrayList;
+import java.util.List;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiServicemodelinfrastructureService;
+import org.springframework.validation.annotation.Validated;
+import javax.validation.Valid;
+import javax.validation.constraints.*;
+
+/**
+ * GenericResourceApiServiceModelInfrastructure
+ */
+@Validated
+@javax.annotation.Generated(value = "io.swagger.codegen.languages.SpringCodegen", date = "2021-07-12T18:08:46.019-04:00")
+@JsonRootName("services")
+public class GenericResourceApiServiceModelInfrastructure   {
+  @JsonProperty("service")
+  @Valid
+  private List<GenericResourceApiServicemodelinfrastructureService> service = null;
+
+  public GenericResourceApiServiceModelInfrastructure service(List<GenericResourceApiServicemodelinfrastructureService> service) {
+    this.service = service;
+    return this;
+  }
+
+  public GenericResourceApiServiceModelInfrastructure addServiceItem(GenericResourceApiServicemodelinfrastructureService serviceItem) {
+    if (this.service == null) {
+      this.service = new ArrayList<>();
+    }
+    this.service.add(serviceItem);
+    return this;
+  }
+
+  /**
+   * Get service
+   * @return service
+  **/
+  @ApiModelProperty(value = "")
+
+  @Valid
+
+  public List<GenericResourceApiServicemodelinfrastructureService> getService() {
+    return service;
+  }
+
+  public void setService(List<GenericResourceApiServicemodelinfrastructureService> service) {
+    this.service = service;
+  }
+
+
+  @Override
+  public boolean equals(java.lang.Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    GenericResourceApiServiceModelInfrastructure genericResourceApiServiceModelInfrastructure = (GenericResourceApiServiceModelInfrastructure) o;
+    return Objects.equals(this.service, genericResourceApiServiceModelInfrastructure.service);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(service);
+  }
+
+  @Override
+  public String toString() {
+    StringBuilder sb = new StringBuilder();
+    sb.append("class GenericResourceApiServiceModelInfrastructure {\n");
+    
+    sb.append("    service: ").append(toIndentedString(service)).append("\n");
+    sb.append("}");
+    return sb.toString();
+  }
+
+  /**
+   * Convert the given object to string with each line indented by 4 spaces
+   * (except the first line).
+   */
+  private String toIndentedString(java.lang.Object o) {
+    if (o == null) {
+      return "null";
+    }
+    return o.toString().replace("\n", "\n    ");
+  }
+}
+
diff --git a/ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/swagger/model/GenericResourceApiServicedataServiceData.java b/ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/swagger/model/GenericResourceApiServicedataServiceData.java
new file mode 100644 (file)
index 0000000..b70d6df
--- /dev/null
@@ -0,0 +1,465 @@
+package org.onap.sdnc.apps.ms.gra.swagger.model;
+
+import java.util.Objects;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonRootName;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiNetworkInstanceGroup;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiOperStatusData;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiRequestinformationRequestInformation;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiSdncrequestheaderSdncRequestHeader;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiServiceLevelOperStatus;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiServiceOperationInformation;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiServiceTopology;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiServicedataServicedataConsumedAllottedResources;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiServicedataServicedataForwardingPaths;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiServicedataServicedataNetworks;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiServicedataServicedataPnfs;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiServicedataServicedataProvidedAllottedResources;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiServicedataServicedataProvidedConfigurations;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiServicedataServicedataVnfs;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiServiceinformationServiceInformation;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiServicerequestinputServiceRequestInput;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiServicetopologyServiceTopology;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiVnfcInstanceGroup;
+import org.springframework.validation.annotation.Validated;
+import javax.validation.Valid;
+import javax.validation.constraints.*;
+
+/**
+ * GenericResourceApiServicedataServiceData
+ */
+@Validated
+@javax.annotation.Generated(value = "io.swagger.codegen.languages.SpringCodegen", date = "2021-07-13T13:26:44.236-04:00")
+@JsonRootName("service-data")
+public class GenericResourceApiServicedataServiceData   {
+  @JsonProperty("service-level-oper-status")
+  private GenericResourceApiOperStatusData serviceLevelOperStatus = null;
+
+  @JsonProperty("request-information")
+  private GenericResourceApiRequestinformationRequestInformation requestInformation = null;
+
+  @JsonProperty("sdnc-request-header")
+  private GenericResourceApiSdncrequestheaderSdncRequestHeader sdncRequestHeader = null;
+
+  @JsonProperty("service-information")
+  private GenericResourceApiServiceinformationServiceInformation serviceInformation = null;
+
+  @JsonProperty("service-request-input")
+  private GenericResourceApiServicerequestinputServiceRequestInput serviceRequestInput = null;
+
+  @JsonProperty("service-topology")
+  private GenericResourceApiServicetopologyServiceTopology serviceTopology = null;
+
+  @JsonProperty("vnfc-instance-groups")
+  private GenericResourceApiVnfcInstanceGroup vnfcInstanceGroups = null;
+
+  @JsonProperty("provided-configurations")
+  private GenericResourceApiServicedataServicedataProvidedConfigurations providedConfigurations = null;
+
+  @JsonProperty("provided-allotted-resources")
+  private GenericResourceApiServicedataServicedataProvidedAllottedResources providedAllottedResources = null;
+
+  @JsonProperty("vnfs")
+  private GenericResourceApiServicedataServicedataVnfs vnfs = null;
+
+  @JsonProperty("forwarding-paths")
+  private GenericResourceApiServicedataServicedataForwardingPaths forwardingPaths = null;
+
+  @JsonProperty("network-instance-groups")
+  private GenericResourceApiNetworkInstanceGroup networkInstanceGroups = null;
+
+  @JsonProperty("networks")
+  private GenericResourceApiServicedataServicedataNetworks networks = null;
+
+  @JsonProperty("consumed-allotted-resources")
+  private GenericResourceApiServicedataServicedataConsumedAllottedResources consumedAllottedResources = null;
+
+  @JsonProperty("pnfs")
+  private GenericResourceApiServicedataServicedataPnfs pnfs = null;
+
+  public GenericResourceApiServicedataServiceData serviceLevelOperStatus(GenericResourceApiOperStatusData serviceLevelOperStatus) {
+    this.serviceLevelOperStatus = serviceLevelOperStatus;
+    return this;
+  }
+
+  /**
+   * Get serviceLevelOperStatus
+   * @return serviceLevelOperStatus
+  **/
+  @ApiModelProperty(value = "")
+
+  @Valid
+
+  public GenericResourceApiOperStatusData getServiceLevelOperStatus() {
+    return serviceLevelOperStatus;
+  }
+
+  public void setServiceLevelOperStatus(GenericResourceApiOperStatusData serviceLevelOperStatus) {
+    this.serviceLevelOperStatus = serviceLevelOperStatus;
+  }
+
+  public GenericResourceApiServicedataServiceData requestInformation(GenericResourceApiRequestinformationRequestInformation requestInformation) {
+    this.requestInformation = requestInformation;
+    return this;
+  }
+
+  /**
+   * Get requestInformation
+   * @return requestInformation
+  **/
+  @ApiModelProperty(value = "")
+
+  @Valid
+
+  public GenericResourceApiRequestinformationRequestInformation getRequestInformation() {
+    return requestInformation;
+  }
+
+  public void setRequestInformation(GenericResourceApiRequestinformationRequestInformation requestInformation) {
+    this.requestInformation = requestInformation;
+  }
+
+  public GenericResourceApiServicedataServiceData sdncRequestHeader(GenericResourceApiSdncrequestheaderSdncRequestHeader sdncRequestHeader) {
+    this.sdncRequestHeader = sdncRequestHeader;
+    return this;
+  }
+
+  /**
+   * Get sdncRequestHeader
+   * @return sdncRequestHeader
+  **/
+  @ApiModelProperty(value = "")
+
+  @Valid
+
+  public GenericResourceApiSdncrequestheaderSdncRequestHeader getSdncRequestHeader() {
+    return sdncRequestHeader;
+  }
+
+  public void setSdncRequestHeader(GenericResourceApiSdncrequestheaderSdncRequestHeader sdncRequestHeader) {
+    this.sdncRequestHeader = sdncRequestHeader;
+  }
+
+  public GenericResourceApiServicedataServiceData serviceInformation(GenericResourceApiServiceinformationServiceInformation serviceInformation) {
+    this.serviceInformation = serviceInformation;
+    return this;
+  }
+
+  /**
+   * Get serviceInformation
+   * @return serviceInformation
+  **/
+  @ApiModelProperty(value = "")
+
+  @Valid
+
+  public GenericResourceApiServiceinformationServiceInformation getServiceInformation() {
+    return serviceInformation;
+  }
+
+  public void setServiceInformation(GenericResourceApiServiceinformationServiceInformation serviceInformation) {
+    this.serviceInformation = serviceInformation;
+  }
+
+  public GenericResourceApiServicedataServiceData serviceRequestInput(GenericResourceApiServicerequestinputServiceRequestInput serviceRequestInput) {
+    this.serviceRequestInput = serviceRequestInput;
+    return this;
+  }
+
+  /**
+   * Get serviceRequestInput
+   * @return serviceRequestInput
+  **/
+  @ApiModelProperty(value = "")
+
+  @Valid
+
+  public GenericResourceApiServicerequestinputServiceRequestInput getServiceRequestInput() {
+    return serviceRequestInput;
+  }
+
+  public void setServiceRequestInput(GenericResourceApiServicerequestinputServiceRequestInput serviceRequestInput) {
+    this.serviceRequestInput = serviceRequestInput;
+  }
+
+  public GenericResourceApiServicedataServiceData serviceTopology(GenericResourceApiServicetopologyServiceTopology serviceTopology) {
+    this.serviceTopology = serviceTopology;
+    return this;
+  }
+
+  /**
+   * Get serviceTopology
+   * @return serviceTopology
+  **/
+  @ApiModelProperty(value = "")
+
+  @Valid
+
+  public GenericResourceApiServicetopologyServiceTopology getServiceTopology() {
+    return serviceTopology;
+  }
+
+  public void setServiceTopology(GenericResourceApiServicetopologyServiceTopology serviceTopology) {
+    this.serviceTopology = serviceTopology;
+  }
+
+  public GenericResourceApiServicedataServiceData vnfcInstanceGroups(GenericResourceApiVnfcInstanceGroup vnfcInstanceGroups) {
+    this.vnfcInstanceGroups = vnfcInstanceGroups;
+    return this;
+  }
+
+  /**
+   * Get vnfcInstanceGroups
+   * @return vnfcInstanceGroups
+  **/
+  @ApiModelProperty(value = "")
+
+  @Valid
+
+  public GenericResourceApiVnfcInstanceGroup getVnfcInstanceGroups() {
+    return vnfcInstanceGroups;
+  }
+
+  public void setVnfcInstanceGroups(GenericResourceApiVnfcInstanceGroup vnfcInstanceGroups) {
+    this.vnfcInstanceGroups = vnfcInstanceGroups;
+  }
+
+  public GenericResourceApiServicedataServiceData providedConfigurations(GenericResourceApiServicedataServicedataProvidedConfigurations providedConfigurations) {
+    this.providedConfigurations = providedConfigurations;
+    return this;
+  }
+
+  /**
+   * Get providedConfigurations
+   * @return providedConfigurations
+  **/
+  @ApiModelProperty(value = "")
+
+  @Valid
+
+  public GenericResourceApiServicedataServicedataProvidedConfigurations getProvidedConfigurations() {
+    return providedConfigurations;
+  }
+
+  public void setProvidedConfigurations(GenericResourceApiServicedataServicedataProvidedConfigurations providedConfigurations) {
+    this.providedConfigurations = providedConfigurations;
+  }
+
+  public GenericResourceApiServicedataServiceData providedAllottedResources(GenericResourceApiServicedataServicedataProvidedAllottedResources providedAllottedResources) {
+    this.providedAllottedResources = providedAllottedResources;
+    return this;
+  }
+
+  /**
+   * Get providedAllottedResources
+   * @return providedAllottedResources
+  **/
+  @ApiModelProperty(value = "")
+
+  @Valid
+
+  public GenericResourceApiServicedataServicedataProvidedAllottedResources getProvidedAllottedResources() {
+    return providedAllottedResources;
+  }
+
+  public void setProvidedAllottedResources(GenericResourceApiServicedataServicedataProvidedAllottedResources providedAllottedResources) {
+    this.providedAllottedResources = providedAllottedResources;
+  }
+
+  public GenericResourceApiServicedataServiceData vnfs(GenericResourceApiServicedataServicedataVnfs vnfs) {
+    this.vnfs = vnfs;
+    return this;
+  }
+
+  /**
+   * Get vnfs
+   * @return vnfs
+  **/
+  @ApiModelProperty(value = "")
+
+  @Valid
+
+  public GenericResourceApiServicedataServicedataVnfs getVnfs() {
+    return vnfs;
+  }
+
+  public void setVnfs(GenericResourceApiServicedataServicedataVnfs vnfs) {
+    this.vnfs = vnfs;
+  }
+
+  public GenericResourceApiServicedataServiceData forwardingPaths(GenericResourceApiServicedataServicedataForwardingPaths forwardingPaths) {
+    this.forwardingPaths = forwardingPaths;
+    return this;
+  }
+
+  /**
+   * Get forwardingPaths
+   * @return forwardingPaths
+  **/
+  @ApiModelProperty(value = "")
+
+  @Valid
+
+  public GenericResourceApiServicedataServicedataForwardingPaths getForwardingPaths() {
+    return forwardingPaths;
+  }
+
+  public void setForwardingPaths(GenericResourceApiServicedataServicedataForwardingPaths forwardingPaths) {
+    this.forwardingPaths = forwardingPaths;
+  }
+
+  public GenericResourceApiServicedataServiceData networkInstanceGroups(GenericResourceApiNetworkInstanceGroup networkInstanceGroups) {
+    this.networkInstanceGroups = networkInstanceGroups;
+    return this;
+  }
+
+  /**
+   * Get networkInstanceGroups
+   * @return networkInstanceGroups
+  **/
+  @ApiModelProperty(value = "")
+
+  @Valid
+
+  public GenericResourceApiNetworkInstanceGroup getNetworkInstanceGroups() {
+    return networkInstanceGroups;
+  }
+
+  public void setNetworkInstanceGroups(GenericResourceApiNetworkInstanceGroup networkInstanceGroups) {
+    this.networkInstanceGroups = networkInstanceGroups;
+  }
+
+  public GenericResourceApiServicedataServiceData networks(GenericResourceApiServicedataServicedataNetworks networks) {
+    this.networks = networks;
+    return this;
+  }
+
+  /**
+   * Get networks
+   * @return networks
+  **/
+  @ApiModelProperty(value = "")
+
+  @Valid
+
+  public GenericResourceApiServicedataServicedataNetworks getNetworks() {
+    return networks;
+  }
+
+  public void setNetworks(GenericResourceApiServicedataServicedataNetworks networks) {
+    this.networks = networks;
+  }
+
+  public GenericResourceApiServicedataServiceData consumedAllottedResources(GenericResourceApiServicedataServicedataConsumedAllottedResources consumedAllottedResources) {
+    this.consumedAllottedResources = consumedAllottedResources;
+    return this;
+  }
+
+  /**
+   * Get consumedAllottedResources
+   * @return consumedAllottedResources
+  **/
+  @ApiModelProperty(value = "")
+
+  @Valid
+
+  public GenericResourceApiServicedataServicedataConsumedAllottedResources getConsumedAllottedResources() {
+    return consumedAllottedResources;
+  }
+
+  public void setConsumedAllottedResources(GenericResourceApiServicedataServicedataConsumedAllottedResources consumedAllottedResources) {
+    this.consumedAllottedResources = consumedAllottedResources;
+  }
+
+  public GenericResourceApiServicedataServiceData pnfs(GenericResourceApiServicedataServicedataPnfs pnfs) {
+    this.pnfs = pnfs;
+    return this;
+  }
+
+  /**
+   * Get pnfs
+   * @return pnfs
+  **/
+  @ApiModelProperty(value = "")
+
+  @Valid
+
+  public GenericResourceApiServicedataServicedataPnfs getPnfs() {
+    return pnfs;
+  }
+
+  public void setPnfs(GenericResourceApiServicedataServicedataPnfs pnfs) {
+    this.pnfs = pnfs;
+  }
+
+
+  @Override
+  public boolean equals(java.lang.Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    GenericResourceApiServicedataServiceData genericResourceApiServicedataServiceData = (GenericResourceApiServicedataServiceData) o;
+    return Objects.equals(this.serviceLevelOperStatus, genericResourceApiServicedataServiceData.serviceLevelOperStatus) &&
+        Objects.equals(this.requestInformation, genericResourceApiServicedataServiceData.requestInformation) &&
+        Objects.equals(this.sdncRequestHeader, genericResourceApiServicedataServiceData.sdncRequestHeader) &&
+        Objects.equals(this.serviceInformation, genericResourceApiServicedataServiceData.serviceInformation) &&
+        Objects.equals(this.serviceRequestInput, genericResourceApiServicedataServiceData.serviceRequestInput) &&
+        Objects.equals(this.serviceTopology, genericResourceApiServicedataServiceData.serviceTopology) &&
+        Objects.equals(this.vnfcInstanceGroups, genericResourceApiServicedataServiceData.vnfcInstanceGroups) &&
+        Objects.equals(this.providedConfigurations, genericResourceApiServicedataServiceData.providedConfigurations) &&
+        Objects.equals(this.providedAllottedResources, genericResourceApiServicedataServiceData.providedAllottedResources) &&
+        Objects.equals(this.vnfs, genericResourceApiServicedataServiceData.vnfs) &&
+        Objects.equals(this.forwardingPaths, genericResourceApiServicedataServiceData.forwardingPaths) &&
+        Objects.equals(this.networkInstanceGroups, genericResourceApiServicedataServiceData.networkInstanceGroups) &&
+        Objects.equals(this.networks, genericResourceApiServicedataServiceData.networks) &&
+        Objects.equals(this.consumedAllottedResources, genericResourceApiServicedataServiceData.consumedAllottedResources) &&
+        Objects.equals(this.pnfs, genericResourceApiServicedataServiceData.pnfs);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(serviceLevelOperStatus, requestInformation, sdncRequestHeader, serviceInformation, serviceRequestInput, serviceTopology, vnfcInstanceGroups, providedConfigurations, providedAllottedResources, vnfs, forwardingPaths, networkInstanceGroups, networks, consumedAllottedResources, pnfs);
+  }
+
+  @Override
+  public String toString() {
+    StringBuilder sb = new StringBuilder();
+    sb.append("class GenericResourceApiServicedataServiceData {\n");
+    
+    sb.append("    serviceLevelOperStatus: ").append(toIndentedString(serviceLevelOperStatus)).append("\n");
+    sb.append("    requestInformation: ").append(toIndentedString(requestInformation)).append("\n");
+    sb.append("    sdncRequestHeader: ").append(toIndentedString(sdncRequestHeader)).append("\n");
+    sb.append("    serviceInformation: ").append(toIndentedString(serviceInformation)).append("\n");
+    sb.append("    serviceRequestInput: ").append(toIndentedString(serviceRequestInput)).append("\n");
+    sb.append("    serviceTopology: ").append(toIndentedString(serviceTopology)).append("\n");
+    sb.append("    vnfcInstanceGroups: ").append(toIndentedString(vnfcInstanceGroups)).append("\n");
+    sb.append("    providedConfigurations: ").append(toIndentedString(providedConfigurations)).append("\n");
+    sb.append("    providedAllottedResources: ").append(toIndentedString(providedAllottedResources)).append("\n");
+    sb.append("    vnfs: ").append(toIndentedString(vnfs)).append("\n");
+    sb.append("    forwardingPaths: ").append(toIndentedString(forwardingPaths)).append("\n");
+    sb.append("    networkInstanceGroups: ").append(toIndentedString(networkInstanceGroups)).append("\n");
+    sb.append("    networks: ").append(toIndentedString(networks)).append("\n");
+    sb.append("    consumedAllottedResources: ").append(toIndentedString(consumedAllottedResources)).append("\n");
+    sb.append("    pnfs: ").append(toIndentedString(pnfs)).append("\n");
+    sb.append("}");
+    return sb.toString();
+  }
+
+  /**
+   * Convert the given object to string with each line indented by 4 spaces
+   * (except the first line).
+   */
+  private String toIndentedString(java.lang.Object o) {
+    if (o == null) {
+      return "null";
+    }
+    return o.toString().replace("\n", "\n    ");
+  }
+}
+
diff --git a/ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/swagger/model/GenericResourceApiServicedataServicedataNetworks.java b/ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/swagger/model/GenericResourceApiServicedataServicedataNetworks.java
new file mode 100644 (file)
index 0000000..1c85947
--- /dev/null
@@ -0,0 +1,95 @@
+package org.onap.sdnc.apps.ms.gra.swagger.model;
+
+import java.util.Objects;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonRootName;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import java.util.ArrayList;
+import java.util.List;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiServicedataServicedataNetworksNetwork;
+import org.springframework.validation.annotation.Validated;
+import javax.validation.Valid;
+import javax.validation.constraints.*;
+
+/**
+ * GenericResourceApiServicedataServicedataNetworks
+ */
+@Validated
+@javax.annotation.Generated(value = "io.swagger.codegen.languages.SpringCodegen", date = "2021-07-23T12:02:01.518-04:00")
+@JsonRootName("networks")
+public class GenericResourceApiServicedataServicedataNetworks   {
+  @JsonProperty("network")
+  @Valid
+  private List<GenericResourceApiServicedataServicedataNetworksNetwork> network = null;
+
+  public GenericResourceApiServicedataServicedataNetworks network(List<GenericResourceApiServicedataServicedataNetworksNetwork> network) {
+    this.network = network;
+    return this;
+  }
+
+  public GenericResourceApiServicedataServicedataNetworks addNetworkItem(GenericResourceApiServicedataServicedataNetworksNetwork networkItem) {
+    if (this.network == null) {
+      this.network = new ArrayList<>();
+    }
+    this.network.add(networkItem);
+    return this;
+  }
+
+  /**
+   * Get network
+   * @return network
+  **/
+  @ApiModelProperty(value = "")
+
+  @Valid
+
+  public List<GenericResourceApiServicedataServicedataNetworksNetwork> getNetwork() {
+    return network;
+  }
+
+  public void setNetwork(List<GenericResourceApiServicedataServicedataNetworksNetwork> network) {
+    this.network = network;
+  }
+
+
+  @Override
+  public boolean equals(java.lang.Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    GenericResourceApiServicedataServicedataNetworks genericResourceApiServicedataServicedataNetworks = (GenericResourceApiServicedataServicedataNetworks) o;
+    return Objects.equals(this.network, genericResourceApiServicedataServicedataNetworks.network);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(network);
+  }
+
+  @Override
+  public String toString() {
+    StringBuilder sb = new StringBuilder();
+    sb.append("class GenericResourceApiServicedataServicedataNetworks {\n");
+    
+    sb.append("    network: ").append(toIndentedString(network)).append("\n");
+    sb.append("}");
+    return sb.toString();
+  }
+
+  /**
+   * Convert the given object to string with each line indented by 4 spaces
+   * (except the first line).
+   */
+  private String toIndentedString(java.lang.Object o) {
+    if (o == null) {
+      return "null";
+    }
+    return o.toString().replace("\n", "\n    ");
+  }
+}
+
diff --git a/ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/swagger/model/GenericResourceApiServicedataServicedataNetworksNetwork.java b/ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/swagger/model/GenericResourceApiServicedataServicedataNetworksNetwork.java
new file mode 100644 (file)
index 0000000..2d8edfe
--- /dev/null
@@ -0,0 +1,109 @@
+package org.onap.sdnc.apps.ms.gra.swagger.model;
+
+import java.util.Objects;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonRootName;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiServicedataServicedataNetworksNetworkNetworkData;
+import org.springframework.validation.annotation.Validated;
+import javax.validation.Valid;
+import javax.validation.constraints.*;
+
+/**
+ * GenericResourceApiServicedataServicedataNetworksNetwork
+ */
+@Validated
+@javax.annotation.Generated(value = "io.swagger.codegen.languages.SpringCodegen", date = "2021-07-23T12:02:01.518-04:00")
+@JsonRootName("network")
+public class GenericResourceApiServicedataServicedataNetworksNetwork   {
+  @JsonProperty("network-id")
+  private String networkId = null;
+
+  @JsonProperty("network-data")
+  private GenericResourceApiServicedataServicedataNetworksNetworkNetworkData networkData = null;
+
+  public GenericResourceApiServicedataServicedataNetworksNetwork networkId(String networkId) {
+    this.networkId = networkId;
+    return this;
+  }
+
+  /**
+   * Get networkId
+   * @return networkId
+  **/
+  @ApiModelProperty(value = "")
+
+
+  public String getNetworkId() {
+    return networkId;
+  }
+
+  public void setNetworkId(String networkId) {
+    this.networkId = networkId;
+  }
+
+  public GenericResourceApiServicedataServicedataNetworksNetwork networkData(GenericResourceApiServicedataServicedataNetworksNetworkNetworkData networkData) {
+    this.networkData = networkData;
+    return this;
+  }
+
+  /**
+   * Get networkData
+   * @return networkData
+  **/
+  @ApiModelProperty(value = "")
+
+  @Valid
+
+  public GenericResourceApiServicedataServicedataNetworksNetworkNetworkData getNetworkData() {
+    return networkData;
+  }
+
+  public void setNetworkData(GenericResourceApiServicedataServicedataNetworksNetworkNetworkData networkData) {
+    this.networkData = networkData;
+  }
+
+
+  @Override
+  public boolean equals(java.lang.Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    GenericResourceApiServicedataServicedataNetworksNetwork genericResourceApiServicedataServicedataNetworksNetwork = (GenericResourceApiServicedataServicedataNetworksNetwork) o;
+    return Objects.equals(this.networkId, genericResourceApiServicedataServicedataNetworksNetwork.networkId) &&
+        Objects.equals(this.networkData, genericResourceApiServicedataServicedataNetworksNetwork.networkData);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(networkId, networkData);
+  }
+
+  @Override
+  public String toString() {
+    StringBuilder sb = new StringBuilder();
+    sb.append("class GenericResourceApiServicedataServicedataNetworksNetwork {\n");
+    
+    sb.append("    networkId: ").append(toIndentedString(networkId)).append("\n");
+    sb.append("    networkData: ").append(toIndentedString(networkData)).append("\n");
+    sb.append("}");
+    return sb.toString();
+  }
+
+  /**
+   * Convert the given object to string with each line indented by 4 spaces
+   * (except the first line).
+   */
+  private String toIndentedString(java.lang.Object o) {
+    if (o == null) {
+      return "null";
+    }
+    return o.toString().replace("\n", "\n    ");
+  }
+}
+
diff --git a/ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/swagger/model/GenericResourceApiServicedataServicedataNetworksNetworkNetworkdataNetworkProvidedAllottedResources.java b/ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/swagger/model/GenericResourceApiServicedataServicedataNetworksNetworkNetworkdataNetworkProvidedAllottedResources.java
new file mode 100644 (file)
index 0000000..da767f1
--- /dev/null
@@ -0,0 +1,93 @@
+package org.onap.sdnc.apps.ms.gra.swagger.model;
+
+import java.util.Objects;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonRootName;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import java.util.ArrayList;
+import java.util.List;
+import org.springframework.validation.annotation.Validated;
+import javax.validation.Valid;
+import javax.validation.constraints.*;
+
+/**
+ * GenericResourceApiServicedataServicedataNetworksNetworkNetworkdataNetworkProvidedAllottedResources
+ */
+@Validated
+@javax.annotation.Generated(value = "io.swagger.codegen.languages.SpringCodegen", date = "2021-07-23T12:02:01.518-04:00")
+@JsonRootName("network-provided-allotted-resources")
+public class GenericResourceApiServicedataServicedataNetworksNetworkNetworkdataNetworkProvidedAllottedResources   {
+  @JsonProperty("network-provided-ar-id")
+  @Valid
+  private List<String> networkProvidedArId = null;
+
+  public GenericResourceApiServicedataServicedataNetworksNetworkNetworkdataNetworkProvidedAllottedResources networkProvidedArId(List<String> networkProvidedArId) {
+    this.networkProvidedArId = networkProvidedArId;
+    return this;
+  }
+
+  public GenericResourceApiServicedataServicedataNetworksNetworkNetworkdataNetworkProvidedAllottedResources addNetworkProvidedArIdItem(String networkProvidedArIdItem) {
+    if (this.networkProvidedArId == null) {
+      this.networkProvidedArId = new ArrayList<>();
+    }
+    this.networkProvidedArId.add(networkProvidedArIdItem);
+    return this;
+  }
+
+  /**
+   * List of allotted resources using capacity from this network
+   * @return networkProvidedArId
+  **/
+  @ApiModelProperty(value = "List of allotted resources using capacity from this network")
+
+
+  public List<String> getNetworkProvidedArId() {
+    return networkProvidedArId;
+  }
+
+  public void setNetworkProvidedArId(List<String> networkProvidedArId) {
+    this.networkProvidedArId = networkProvidedArId;
+  }
+
+
+  @Override
+  public boolean equals(java.lang.Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    GenericResourceApiServicedataServicedataNetworksNetworkNetworkdataNetworkProvidedAllottedResources genericResourceApiServicedataServicedataNetworksNetworkNetworkdataNetworkProvidedAllottedResources = (GenericResourceApiServicedataServicedataNetworksNetworkNetworkdataNetworkProvidedAllottedResources) o;
+    return Objects.equals(this.networkProvidedArId, genericResourceApiServicedataServicedataNetworksNetworkNetworkdataNetworkProvidedAllottedResources.networkProvidedArId);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(networkProvidedArId);
+  }
+
+  @Override
+  public String toString() {
+    StringBuilder sb = new StringBuilder();
+    sb.append("class GenericResourceApiServicedataServicedataNetworksNetworkNetworkdataNetworkProvidedAllottedResources {\n");
+    
+    sb.append("    networkProvidedArId: ").append(toIndentedString(networkProvidedArId)).append("\n");
+    sb.append("}");
+    return sb.toString();
+  }
+
+  /**
+   * Convert the given object to string with each line indented by 4 spaces
+   * (except the first line).
+   */
+  private String toIndentedString(java.lang.Object o) {
+    if (o == null) {
+      return "null";
+    }
+    return o.toString().replace("\n", "\n    ");
+  }
+}
+
diff --git a/ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/swagger/model/GenericResourceApiServicedataServicedataVnfsVnf.java b/ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/swagger/model/GenericResourceApiServicedataServicedataVnfsVnf.java
new file mode 100644 (file)
index 0000000..c4823d9
--- /dev/null
@@ -0,0 +1,109 @@
+package org.onap.sdnc.apps.ms.gra.swagger.model;
+
+import java.util.Objects;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonRootName;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiServicedataServicedataVnfsVnfVnfData;
+import org.springframework.validation.annotation.Validated;
+import javax.validation.Valid;
+import javax.validation.constraints.*;
+
+/**
+ * GenericResourceApiServicedataServicedataVnfsVnf
+ */
+@Validated
+@javax.annotation.Generated(value = "io.swagger.codegen.languages.SpringCodegen", date = "2021-07-13T13:26:44.236-04:00")
+@JsonRootName("vnf")
+public class GenericResourceApiServicedataServicedataVnfsVnf   {
+  @JsonProperty("vnf-data")
+  private GenericResourceApiServicedataServicedataVnfsVnfVnfData vnfData = null;
+
+  @JsonProperty("vnf-id")
+  private String vnfId = null;
+
+  public GenericResourceApiServicedataServicedataVnfsVnf vnfData(GenericResourceApiServicedataServicedataVnfsVnfVnfData vnfData) {
+    this.vnfData = vnfData;
+    return this;
+  }
+
+  /**
+   * Get vnfData
+   * @return vnfData
+  **/
+  @ApiModelProperty(value = "")
+
+  @Valid
+
+  public GenericResourceApiServicedataServicedataVnfsVnfVnfData getVnfData() {
+    return vnfData;
+  }
+
+  public void setVnfData(GenericResourceApiServicedataServicedataVnfsVnfVnfData vnfData) {
+    this.vnfData = vnfData;
+  }
+
+  public GenericResourceApiServicedataServicedataVnfsVnf vnfId(String vnfId) {
+    this.vnfId = vnfId;
+    return this;
+  }
+
+  /**
+   * Get vnfId
+   * @return vnfId
+  **/
+  @ApiModelProperty(value = "")
+
+
+  public String getVnfId() {
+    return vnfId;
+  }
+
+  public void setVnfId(String vnfId) {
+    this.vnfId = vnfId;
+  }
+
+
+  @Override
+  public boolean equals(java.lang.Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    GenericResourceApiServicedataServicedataVnfsVnf genericResourceApiServicedataServicedataVnfsVnf = (GenericResourceApiServicedataServicedataVnfsVnf) o;
+    return Objects.equals(this.vnfData, genericResourceApiServicedataServicedataVnfsVnf.vnfData) &&
+        Objects.equals(this.vnfId, genericResourceApiServicedataServicedataVnfsVnf.vnfId);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(vnfData, vnfId);
+  }
+
+  @Override
+  public String toString() {
+    StringBuilder sb = new StringBuilder();
+    sb.append("class GenericResourceApiServicedataServicedataVnfsVnf {\n");
+    
+    sb.append("    vnfData: ").append(toIndentedString(vnfData)).append("\n");
+    sb.append("    vnfId: ").append(toIndentedString(vnfId)).append("\n");
+    sb.append("}");
+    return sb.toString();
+  }
+
+  /**
+   * Convert the given object to string with each line indented by 4 spaces
+   * (except the first line).
+   */
+  private String toIndentedString(java.lang.Object o) {
+    if (o == null) {
+      return "null";
+    }
+    return o.toString().replace("\n", "\n    ");
+  }
+}
+
diff --git a/ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/swagger/model/GenericResourceApiServicedataServicedataVnfsVnfVnfData.java b/ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/swagger/model/GenericResourceApiServicedataServicedataVnfsVnfVnfData.java
new file mode 100644 (file)
index 0000000..ebc5ad6
--- /dev/null
@@ -0,0 +1,384 @@
+package org.onap.sdnc.apps.ms.gra.swagger.model;
+
+import java.util.Objects;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonRootName;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiLicenseinformationLicenseInformation;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiOperStatusData;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiRequestinformationRequestInformation;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiSdncrequestheaderSdncRequestHeader;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiServicedataServicedataVnfsVnfVnfdataVfModules;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiServicedataServicedataVnfsVnfVnfdataVnfProvidedAllottedResources;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiServiceinformationServiceInformation;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiVnfLevelOperStatus;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiVnfNetworkCollection;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiVnfOperationInformation;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiVnfSubInterfaceGroup;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiVnfTopology;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiVnfinformationVnfInformation;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiVnfrequestinputVnfRequestInput;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiVnftopologyVnfTopology;
+import org.springframework.validation.annotation.Validated;
+import javax.validation.Valid;
+import javax.validation.constraints.*;
+
+/**
+ * GenericResourceApiServicedataServicedataVnfsVnfVnfData
+ */
+@Validated
+@javax.annotation.Generated(value = "io.swagger.codegen.languages.SpringCodegen", date = "2021-07-12T18:08:46.019-04:00")
+@JsonRootName("vnf-data")
+public class GenericResourceApiServicedataServicedataVnfsVnfVnfData   {
+  @JsonProperty("vnf-level-oper-status")
+  private GenericResourceApiOperStatusData vnfLevelOperStatus = null;
+
+  @JsonProperty("license-information")
+  private GenericResourceApiLicenseinformationLicenseInformation licenseInformation = null;
+
+  @JsonProperty("request-information")
+  private GenericResourceApiRequestinformationRequestInformation requestInformation = null;
+
+  @JsonProperty("sdnc-request-header")
+  private GenericResourceApiSdncrequestheaderSdncRequestHeader sdncRequestHeader = null;
+
+  @JsonProperty("service-information")
+  private GenericResourceApiServiceinformationServiceInformation serviceInformation = null;
+
+  @JsonProperty("vnf-information")
+  private GenericResourceApiVnfinformationVnfInformation vnfInformation = null;
+
+  @JsonProperty("vnf-request-input")
+  private GenericResourceApiVnfrequestinputVnfRequestInput vnfRequestInput = null;
+
+  @JsonProperty("vnf-topology")
+  private GenericResourceApiVnftopologyVnfTopology vnfTopology = null;
+
+  @JsonProperty("vnf-network-collections")
+  private GenericResourceApiVnfNetworkCollection vnfNetworkCollections = null;
+
+  @JsonProperty("vnf-sub-interface-groups")
+  private GenericResourceApiVnfSubInterfaceGroup vnfSubInterfaceGroups = null;
+
+  @JsonProperty("vf-modules")
+  private GenericResourceApiServicedataServicedataVnfsVnfVnfdataVfModules vfModules = null;
+
+  @JsonProperty("vnf-provided-allotted-resources")
+  private GenericResourceApiServicedataServicedataVnfsVnfVnfdataVnfProvidedAllottedResources vnfProvidedAllottedResources = null;
+
+  public GenericResourceApiServicedataServicedataVnfsVnfVnfData vnfLevelOperStatus(GenericResourceApiOperStatusData vnfLevelOperStatus) {
+    this.vnfLevelOperStatus = vnfLevelOperStatus;
+    return this;
+  }
+
+  /**
+   * Get vnfLevelOperStatus
+   * @return vnfLevelOperStatus
+  **/
+  @ApiModelProperty(value = "")
+
+  @Valid
+
+  public GenericResourceApiOperStatusData getVnfLevelOperStatus() {
+    return vnfLevelOperStatus;
+  }
+
+  public void setVnfLevelOperStatus(GenericResourceApiOperStatusData vnfLevelOperStatus) {
+    this.vnfLevelOperStatus = vnfLevelOperStatus;
+  }
+
+  public GenericResourceApiServicedataServicedataVnfsVnfVnfData licenseInformation(GenericResourceApiLicenseinformationLicenseInformation licenseInformation) {
+    this.licenseInformation = licenseInformation;
+    return this;
+  }
+
+  /**
+   * Get licenseInformation
+   * @return licenseInformation
+  **/
+  @ApiModelProperty(value = "")
+
+  @Valid
+
+  public GenericResourceApiLicenseinformationLicenseInformation getLicenseInformation() {
+    return licenseInformation;
+  }
+
+  public void setLicenseInformation(GenericResourceApiLicenseinformationLicenseInformation licenseInformation) {
+    this.licenseInformation = licenseInformation;
+  }
+
+  public GenericResourceApiServicedataServicedataVnfsVnfVnfData requestInformation(GenericResourceApiRequestinformationRequestInformation requestInformation) {
+    this.requestInformation = requestInformation;
+    return this;
+  }
+
+  /**
+   * Get requestInformation
+   * @return requestInformation
+  **/
+  @ApiModelProperty(value = "")
+
+  @Valid
+
+  public GenericResourceApiRequestinformationRequestInformation getRequestInformation() {
+    return requestInformation;
+  }
+
+  public void setRequestInformation(GenericResourceApiRequestinformationRequestInformation requestInformation) {
+    this.requestInformation = requestInformation;
+  }
+
+  public GenericResourceApiServicedataServicedataVnfsVnfVnfData sdncRequestHeader(GenericResourceApiSdncrequestheaderSdncRequestHeader sdncRequestHeader) {
+    this.sdncRequestHeader = sdncRequestHeader;
+    return this;
+  }
+
+  /**
+   * Get sdncRequestHeader
+   * @return sdncRequestHeader
+  **/
+  @ApiModelProperty(value = "")
+
+  @Valid
+
+  public GenericResourceApiSdncrequestheaderSdncRequestHeader getSdncRequestHeader() {
+    return sdncRequestHeader;
+  }
+
+  public void setSdncRequestHeader(GenericResourceApiSdncrequestheaderSdncRequestHeader sdncRequestHeader) {
+    this.sdncRequestHeader = sdncRequestHeader;
+  }
+
+  public GenericResourceApiServicedataServicedataVnfsVnfVnfData serviceInformation(GenericResourceApiServiceinformationServiceInformation serviceInformation) {
+    this.serviceInformation = serviceInformation;
+    return this;
+  }
+
+  /**
+   * Get serviceInformation
+   * @return serviceInformation
+  **/
+  @ApiModelProperty(value = "")
+
+  @Valid
+
+  public GenericResourceApiServiceinformationServiceInformation getServiceInformation() {
+    return serviceInformation;
+  }
+
+  public void setServiceInformation(GenericResourceApiServiceinformationServiceInformation serviceInformation) {
+    this.serviceInformation = serviceInformation;
+  }
+
+  public GenericResourceApiServicedataServicedataVnfsVnfVnfData vnfInformation(GenericResourceApiVnfinformationVnfInformation vnfInformation) {
+    this.vnfInformation = vnfInformation;
+    return this;
+  }
+
+  /**
+   * Get vnfInformation
+   * @return vnfInformation
+  **/
+  @ApiModelProperty(value = "")
+
+  @Valid
+
+  public GenericResourceApiVnfinformationVnfInformation getVnfInformation() {
+    return vnfInformation;
+  }
+
+  public void setVnfInformation(GenericResourceApiVnfinformationVnfInformation vnfInformation) {
+    this.vnfInformation = vnfInformation;
+  }
+
+  public GenericResourceApiServicedataServicedataVnfsVnfVnfData vnfRequestInput(GenericResourceApiVnfrequestinputVnfRequestInput vnfRequestInput) {
+    this.vnfRequestInput = vnfRequestInput;
+    return this;
+  }
+
+  /**
+   * Get vnfRequestInput
+   * @return vnfRequestInput
+  **/
+  @ApiModelProperty(value = "")
+
+  @Valid
+
+  public GenericResourceApiVnfrequestinputVnfRequestInput getVnfRequestInput() {
+    return vnfRequestInput;
+  }
+
+  public void setVnfRequestInput(GenericResourceApiVnfrequestinputVnfRequestInput vnfRequestInput) {
+    this.vnfRequestInput = vnfRequestInput;
+  }
+
+  public GenericResourceApiServicedataServicedataVnfsVnfVnfData vnfTopology(GenericResourceApiVnftopologyVnfTopology vnfTopology) {
+    this.vnfTopology = vnfTopology;
+    return this;
+  }
+
+  /**
+   * Get vnfTopology
+   * @return vnfTopology
+  **/
+  @ApiModelProperty(value = "")
+
+  @Valid
+
+  public GenericResourceApiVnftopologyVnfTopology getVnfTopology() {
+    return vnfTopology;
+  }
+
+  public void setVnfTopology(GenericResourceApiVnftopologyVnfTopology vnfTopology) {
+    this.vnfTopology = vnfTopology;
+  }
+
+  public GenericResourceApiServicedataServicedataVnfsVnfVnfData vnfNetworkCollections(GenericResourceApiVnfNetworkCollection vnfNetworkCollections) {
+    this.vnfNetworkCollections = vnfNetworkCollections;
+    return this;
+  }
+
+  /**
+   * Get vnfNetworkCollections
+   * @return vnfNetworkCollections
+  **/
+  @ApiModelProperty(value = "")
+
+  @Valid
+
+  public GenericResourceApiVnfNetworkCollection getVnfNetworkCollections() {
+    return vnfNetworkCollections;
+  }
+
+  public void setVnfNetworkCollections(GenericResourceApiVnfNetworkCollection vnfNetworkCollections) {
+    this.vnfNetworkCollections = vnfNetworkCollections;
+  }
+
+  public GenericResourceApiServicedataServicedataVnfsVnfVnfData vnfSubInterfaceGroups(GenericResourceApiVnfSubInterfaceGroup vnfSubInterfaceGroups) {
+    this.vnfSubInterfaceGroups = vnfSubInterfaceGroups;
+    return this;
+  }
+
+  /**
+   * Get vnfSubInterfaceGroups
+   * @return vnfSubInterfaceGroups
+  **/
+  @ApiModelProperty(value = "")
+
+  @Valid
+
+  public GenericResourceApiVnfSubInterfaceGroup getVnfSubInterfaceGroups() {
+    return vnfSubInterfaceGroups;
+  }
+
+  public void setVnfSubInterfaceGroups(GenericResourceApiVnfSubInterfaceGroup vnfSubInterfaceGroups) {
+    this.vnfSubInterfaceGroups = vnfSubInterfaceGroups;
+  }
+
+  public GenericResourceApiServicedataServicedataVnfsVnfVnfData vfModules(GenericResourceApiServicedataServicedataVnfsVnfVnfdataVfModules vfModules) {
+    this.vfModules = vfModules;
+    return this;
+  }
+
+  /**
+   * Get vfModules
+   * @return vfModules
+  **/
+  @ApiModelProperty(value = "")
+
+  @Valid
+
+  public GenericResourceApiServicedataServicedataVnfsVnfVnfdataVfModules getVfModules() {
+    return vfModules;
+  }
+
+  public void setVfModules(GenericResourceApiServicedataServicedataVnfsVnfVnfdataVfModules vfModules) {
+    this.vfModules = vfModules;
+  }
+
+  public GenericResourceApiServicedataServicedataVnfsVnfVnfData vnfProvidedAllottedResources(GenericResourceApiServicedataServicedataVnfsVnfVnfdataVnfProvidedAllottedResources vnfProvidedAllottedResources) {
+    this.vnfProvidedAllottedResources = vnfProvidedAllottedResources;
+    return this;
+  }
+
+  /**
+   * Get vnfProvidedAllottedResources
+   * @return vnfProvidedAllottedResources
+  **/
+  @ApiModelProperty(value = "")
+
+  @Valid
+
+  public GenericResourceApiServicedataServicedataVnfsVnfVnfdataVnfProvidedAllottedResources getVnfProvidedAllottedResources() {
+    return vnfProvidedAllottedResources;
+  }
+
+  public void setVnfProvidedAllottedResources(GenericResourceApiServicedataServicedataVnfsVnfVnfdataVnfProvidedAllottedResources vnfProvidedAllottedResources) {
+    this.vnfProvidedAllottedResources = vnfProvidedAllottedResources;
+  }
+
+
+  @Override
+  public boolean equals(java.lang.Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    GenericResourceApiServicedataServicedataVnfsVnfVnfData genericResourceApiServicedataServicedataVnfsVnfVnfData = (GenericResourceApiServicedataServicedataVnfsVnfVnfData) o;
+    return Objects.equals(this.vnfLevelOperStatus, genericResourceApiServicedataServicedataVnfsVnfVnfData.vnfLevelOperStatus) &&
+        Objects.equals(this.licenseInformation, genericResourceApiServicedataServicedataVnfsVnfVnfData.licenseInformation) &&
+        Objects.equals(this.requestInformation, genericResourceApiServicedataServicedataVnfsVnfVnfData.requestInformation) &&
+        Objects.equals(this.sdncRequestHeader, genericResourceApiServicedataServicedataVnfsVnfVnfData.sdncRequestHeader) &&
+        Objects.equals(this.serviceInformation, genericResourceApiServicedataServicedataVnfsVnfVnfData.serviceInformation) &&
+        Objects.equals(this.vnfInformation, genericResourceApiServicedataServicedataVnfsVnfVnfData.vnfInformation) &&
+        Objects.equals(this.vnfRequestInput, genericResourceApiServicedataServicedataVnfsVnfVnfData.vnfRequestInput) &&
+        Objects.equals(this.vnfTopology, genericResourceApiServicedataServicedataVnfsVnfVnfData.vnfTopology) &&
+        Objects.equals(this.vnfNetworkCollections, genericResourceApiServicedataServicedataVnfsVnfVnfData.vnfNetworkCollections) &&
+        Objects.equals(this.vnfSubInterfaceGroups, genericResourceApiServicedataServicedataVnfsVnfVnfData.vnfSubInterfaceGroups) &&
+        Objects.equals(this.vfModules, genericResourceApiServicedataServicedataVnfsVnfVnfData.vfModules) &&
+        Objects.equals(this.vnfProvidedAllottedResources, genericResourceApiServicedataServicedataVnfsVnfVnfData.vnfProvidedAllottedResources);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(vnfLevelOperStatus, licenseInformation, requestInformation, sdncRequestHeader, serviceInformation, vnfInformation, vnfRequestInput, vnfTopology, vnfNetworkCollections, vnfSubInterfaceGroups, vfModules, vnfProvidedAllottedResources);
+  }
+
+  @Override
+  public String toString() {
+    StringBuilder sb = new StringBuilder();
+    sb.append("class GenericResourceApiServicedataServicedataVnfsVnfVnfData {\n");
+    
+    sb.append("    vnfLevelOperStatus: ").append(toIndentedString(vnfLevelOperStatus)).append("\n");
+    sb.append("    licenseInformation: ").append(toIndentedString(licenseInformation)).append("\n");
+    sb.append("    requestInformation: ").append(toIndentedString(requestInformation)).append("\n");
+    sb.append("    sdncRequestHeader: ").append(toIndentedString(sdncRequestHeader)).append("\n");
+    sb.append("    serviceInformation: ").append(toIndentedString(serviceInformation)).append("\n");
+    sb.append("    vnfInformation: ").append(toIndentedString(vnfInformation)).append("\n");
+    sb.append("    vnfRequestInput: ").append(toIndentedString(vnfRequestInput)).append("\n");
+    sb.append("    vnfTopology: ").append(toIndentedString(vnfTopology)).append("\n");
+    sb.append("    vnfNetworkCollections: ").append(toIndentedString(vnfNetworkCollections)).append("\n");
+    sb.append("    vnfSubInterfaceGroups: ").append(toIndentedString(vnfSubInterfaceGroups)).append("\n");
+    sb.append("    vfModules: ").append(toIndentedString(vfModules)).append("\n");
+    sb.append("    vnfProvidedAllottedResources: ").append(toIndentedString(vnfProvidedAllottedResources)).append("\n");
+    sb.append("}");
+    return sb.toString();
+  }
+
+  /**
+   * Convert the given object to string with each line indented by 4 spaces
+   * (except the first line).
+   */
+  private String toIndentedString(java.lang.Object o) {
+    if (o == null) {
+      return "null";
+    }
+    return o.toString().replace("\n", "\n    ");
+  }
+}
+
diff --git a/ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/swagger/model/GenericResourceApiServicedataServicedataVnfsVnfVnfdataVfmodulesVfModule.java b/ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/swagger/model/GenericResourceApiServicedataServicedataVnfsVnfVnfdataVfmodulesVfModule.java
new file mode 100644 (file)
index 0000000..3620148
--- /dev/null
@@ -0,0 +1,109 @@
+package org.onap.sdnc.apps.ms.gra.swagger.model;
+
+import java.util.Objects;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonRootName;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiServicedataServicedataVnfsVnfVnfdataVfmodulesVfmoduleVfModuleData;
+import org.springframework.validation.annotation.Validated;
+import javax.validation.Valid;
+import javax.validation.constraints.*;
+
+/**
+ * GenericResourceApiServicedataServicedataVnfsVnfVnfdataVfmodulesVfModule
+ */
+@Validated
+@javax.annotation.Generated(value = "io.swagger.codegen.languages.SpringCodegen", date = "2021-07-13T13:26:44.236-04:00")
+@JsonRootName("vf-module")
+public class GenericResourceApiServicedataServicedataVnfsVnfVnfdataVfmodulesVfModule   {
+  @JsonProperty("vf-module-data")
+  private GenericResourceApiServicedataServicedataVnfsVnfVnfdataVfmodulesVfmoduleVfModuleData vfModuleData = null;
+
+  @JsonProperty("vf-module-id")
+  private String vfModuleId = null;
+
+  public GenericResourceApiServicedataServicedataVnfsVnfVnfdataVfmodulesVfModule vfModuleData(GenericResourceApiServicedataServicedataVnfsVnfVnfdataVfmodulesVfmoduleVfModuleData vfModuleData) {
+    this.vfModuleData = vfModuleData;
+    return this;
+  }
+
+  /**
+   * Get vfModuleData
+   * @return vfModuleData
+  **/
+  @ApiModelProperty(value = "")
+
+  @Valid
+
+  public GenericResourceApiServicedataServicedataVnfsVnfVnfdataVfmodulesVfmoduleVfModuleData getVfModuleData() {
+    return vfModuleData;
+  }
+
+  public void setVfModuleData(GenericResourceApiServicedataServicedataVnfsVnfVnfdataVfmodulesVfmoduleVfModuleData vfModuleData) {
+    this.vfModuleData = vfModuleData;
+  }
+
+  public GenericResourceApiServicedataServicedataVnfsVnfVnfdataVfmodulesVfModule vfModuleId(String vfModuleId) {
+    this.vfModuleId = vfModuleId;
+    return this;
+  }
+
+  /**
+   * Get vfModuleId
+   * @return vfModuleId
+  **/
+  @ApiModelProperty(value = "")
+
+
+  public String getVfModuleId() {
+    return vfModuleId;
+  }
+
+  public void setVfModuleId(String vfModuleId) {
+    this.vfModuleId = vfModuleId;
+  }
+
+
+  @Override
+  public boolean equals(java.lang.Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    GenericResourceApiServicedataServicedataVnfsVnfVnfdataVfmodulesVfModule genericResourceApiServicedataServicedataVnfsVnfVnfdataVfmodulesVfModule = (GenericResourceApiServicedataServicedataVnfsVnfVnfdataVfmodulesVfModule) o;
+    return Objects.equals(this.vfModuleData, genericResourceApiServicedataServicedataVnfsVnfVnfdataVfmodulesVfModule.vfModuleData) &&
+        Objects.equals(this.vfModuleId, genericResourceApiServicedataServicedataVnfsVnfVnfdataVfmodulesVfModule.vfModuleId);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(vfModuleData, vfModuleId);
+  }
+
+  @Override
+  public String toString() {
+    StringBuilder sb = new StringBuilder();
+    sb.append("class GenericResourceApiServicedataServicedataVnfsVnfVnfdataVfmodulesVfModule {\n");
+    
+    sb.append("    vfModuleData: ").append(toIndentedString(vfModuleData)).append("\n");
+    sb.append("    vfModuleId: ").append(toIndentedString(vfModuleId)).append("\n");
+    sb.append("}");
+    return sb.toString();
+  }
+
+  /**
+   * Convert the given object to string with each line indented by 4 spaces
+   * (except the first line).
+   */
+  private String toIndentedString(java.lang.Object o) {
+    if (o == null) {
+      return "null";
+    }
+    return o.toString().replace("\n", "\n    ");
+  }
+}
+
diff --git a/ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/swagger/model/GenericResourceApiServicemodelinfrastructureService.java b/ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/swagger/model/GenericResourceApiServicemodelinfrastructureService.java
new file mode 100644 (file)
index 0000000..3d41494
--- /dev/null
@@ -0,0 +1,139 @@
+package org.onap.sdnc.apps.ms.gra.swagger.model;
+
+import java.util.Objects;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonRootName;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiServiceData;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiServiceStatus;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiServicedataServiceData;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiServicestatusServiceStatus;
+import org.springframework.validation.annotation.Validated;
+import javax.validation.Valid;
+import javax.validation.constraints.*;
+
+/**
+ * GenericResourceApiServicemodelinfrastructureService
+ */
+@Validated
+@javax.annotation.Generated(value = "io.swagger.codegen.languages.SpringCodegen", date = "2021-07-12T18:08:46.019-04:00")
+
+@JsonRootName("service")
+public class GenericResourceApiServicemodelinfrastructureService   {
+  @JsonProperty("service-data")
+  private GenericResourceApiServicedataServiceData serviceData = null;
+
+  @JsonProperty("service-status")
+  private GenericResourceApiServicestatusServiceStatus serviceStatus = null;
+
+  @JsonProperty("service-instance-id")
+  private String serviceInstanceId = null;
+
+  public GenericResourceApiServicemodelinfrastructureService serviceData(GenericResourceApiServicedataServiceData serviceData) {
+    this.serviceData = serviceData;
+    return this;
+  }
+
+  /**
+   * Get serviceData
+   * @return serviceData
+  **/
+  @ApiModelProperty(value = "")
+
+  @Valid
+
+  public GenericResourceApiServicedataServiceData getServiceData() {
+    return serviceData;
+  }
+
+  public void setServiceData(GenericResourceApiServicedataServiceData serviceData) {
+    this.serviceData = serviceData;
+  }
+
+  public GenericResourceApiServicemodelinfrastructureService serviceStatus(GenericResourceApiServicestatusServiceStatus serviceStatus) {
+    this.serviceStatus = serviceStatus;
+    return this;
+  }
+
+  /**
+   * Get serviceStatus
+   * @return serviceStatus
+  **/
+  @ApiModelProperty(value = "")
+
+  @Valid
+
+  public GenericResourceApiServicestatusServiceStatus getServiceStatus() {
+    return serviceStatus;
+  }
+
+  public void setServiceStatus(GenericResourceApiServicestatusServiceStatus serviceStatus) {
+    this.serviceStatus = serviceStatus;
+  }
+
+  public GenericResourceApiServicemodelinfrastructureService serviceInstanceId(String serviceInstanceId) {
+    this.serviceInstanceId = serviceInstanceId;
+    return this;
+  }
+
+  /**
+   * Keep as M
+   * @return serviceInstanceId
+  **/
+  @ApiModelProperty(value = "Keep as M")
+
+
+  public String getServiceInstanceId() {
+    return serviceInstanceId;
+  }
+
+  public void setServiceInstanceId(String serviceInstanceId) {
+    this.serviceInstanceId = serviceInstanceId;
+  }
+
+
+  @Override
+  public boolean equals(java.lang.Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    GenericResourceApiServicemodelinfrastructureService genericResourceApiServicemodelinfrastructureService = (GenericResourceApiServicemodelinfrastructureService) o;
+    return Objects.equals(this.serviceData, genericResourceApiServicemodelinfrastructureService.serviceData) &&
+        Objects.equals(this.serviceStatus, genericResourceApiServicemodelinfrastructureService.serviceStatus) &&
+        Objects.equals(this.serviceInstanceId, genericResourceApiServicemodelinfrastructureService.serviceInstanceId);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(serviceData, serviceStatus, serviceInstanceId);
+  }
+
+  @Override
+  public String toString() {
+    StringBuilder sb = new StringBuilder();
+    sb.append("class GenericResourceApiServicemodelinfrastructureService {\n");
+    
+    sb.append("    serviceData: ").append(toIndentedString(serviceData)).append("\n");
+    sb.append("    serviceStatus: ").append(toIndentedString(serviceStatus)).append("\n");
+    sb.append("    serviceInstanceId: ").append(toIndentedString(serviceInstanceId)).append("\n");
+    sb.append("}");
+    return sb.toString();
+  }
+
+  /**
+   * Convert the given object to string with each line indented by 4 spaces
+   * (except the first line).
+   */
+  private String toIndentedString(java.lang.Object o) {
+    if (o == null) {
+      return "null";
+    }
+    return o.toString().replace("\n", "\n    ");
+  }
+}
+
diff --git a/ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/swagger/model/GenericResourceApiServicestatusServiceStatus.java b/ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/swagger/model/GenericResourceApiServicestatusServiceStatus.java
new file mode 100644 (file)
index 0000000..2904d34
--- /dev/null
@@ -0,0 +1,261 @@
+package org.onap.sdnc.apps.ms.gra.swagger.model;
+
+import java.util.Objects;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonRootName;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiRequestStatusEnumeration;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiRpcActionEnumeration;
+import org.springframework.validation.annotation.Validated;
+import javax.validation.Valid;
+import javax.validation.constraints.*;
+
+/**
+ * GenericResourceApiServicestatusServiceStatus
+ */
+@Validated
+@javax.annotation.Generated(value = "io.swagger.codegen.languages.SpringCodegen", date = "2021-07-13T13:26:44.236-04:00")
+@JsonRootName("service-status")
+public class GenericResourceApiServicestatusServiceStatus   {
+  @JsonProperty("response-code")
+  private String responseCode = null;
+
+  @JsonProperty("response-message")
+  private String responseMessage = null;
+
+  @JsonProperty("action")
+  private String action = null;
+
+  @JsonProperty("response-timestamp")
+  private String responseTimestamp = null;
+
+  @JsonProperty("request-status")
+  private GenericResourceApiRequestStatusEnumeration requestStatus = null;
+
+  @JsonProperty("final-indicator")
+  private String finalIndicator = null;
+
+  @JsonProperty("rpc-name")
+  private String rpcName = null;
+
+  @JsonProperty("rpc-action")
+  private GenericResourceApiRpcActionEnumeration rpcAction = null;
+
+  public GenericResourceApiServicestatusServiceStatus responseCode(String responseCode) {
+    this.responseCode = responseCode;
+    return this;
+  }
+
+  /**
+   * Get responseCode
+   * @return responseCode
+  **/
+  @ApiModelProperty(value = "")
+
+
+  public String getResponseCode() {
+    return responseCode;
+  }
+
+  public void setResponseCode(String responseCode) {
+    this.responseCode = responseCode;
+  }
+
+  public GenericResourceApiServicestatusServiceStatus responseMessage(String responseMessage) {
+    this.responseMessage = responseMessage;
+    return this;
+  }
+
+  /**
+   * Get responseMessage
+   * @return responseMessage
+  **/
+  @ApiModelProperty(value = "")
+
+
+  public String getResponseMessage() {
+    return responseMessage;
+  }
+
+  public void setResponseMessage(String responseMessage) {
+    this.responseMessage = responseMessage;
+  }
+
+  public GenericResourceApiServicestatusServiceStatus action(String action) {
+    this.action = action;
+    return this;
+  }
+
+  /**
+   * value would one of possible request-actions; match the list in service-data oper-status
+   * @return action
+  **/
+  @ApiModelProperty(value = "value would one of possible request-actions; match the list in service-data oper-status")
+
+
+  public String getAction() {
+    return action;
+  }
+
+  public void setAction(String action) {
+    this.action = action;
+  }
+
+  public GenericResourceApiServicestatusServiceStatus responseTimestamp(String responseTimestamp) {
+    this.responseTimestamp = responseTimestamp;
+    return this;
+  }
+
+  /**
+   * Get responseTimestamp
+   * @return responseTimestamp
+  **/
+  @ApiModelProperty(value = "")
+
+
+  public String getResponseTimestamp() {
+    return responseTimestamp;
+  }
+
+  public void setResponseTimestamp(String responseTimestamp) {
+    this.responseTimestamp = responseTimestamp;
+  }
+
+  public GenericResourceApiServicestatusServiceStatus requestStatus(GenericResourceApiRequestStatusEnumeration requestStatus) {
+    this.requestStatus = requestStatus;
+    return this;
+  }
+
+  /**
+   * Get requestStatus
+   * @return requestStatus
+  **/
+  @ApiModelProperty(value = "")
+
+  @Valid
+
+  public GenericResourceApiRequestStatusEnumeration getRequestStatus() {
+    return requestStatus;
+  }
+
+  public void setRequestStatus(GenericResourceApiRequestStatusEnumeration requestStatus) {
+    this.requestStatus = requestStatus;
+  }
+
+  public GenericResourceApiServicestatusServiceStatus finalIndicator(String finalIndicator) {
+    this.finalIndicator = finalIndicator;
+    return this;
+  }
+
+  /**
+   * Get finalIndicator
+   * @return finalIndicator
+  **/
+  @ApiModelProperty(value = "")
+
+
+  public String getFinalIndicator() {
+    return finalIndicator;
+  }
+
+  public void setFinalIndicator(String finalIndicator) {
+    this.finalIndicator = finalIndicator;
+  }
+
+  public GenericResourceApiServicestatusServiceStatus rpcName(String rpcName) {
+    this.rpcName = rpcName;
+    return this;
+  }
+
+  /**
+   * Get rpcName
+   * @return rpcName
+  **/
+  @ApiModelProperty(value = "")
+
+
+  public String getRpcName() {
+    return rpcName;
+  }
+
+  public void setRpcName(String rpcName) {
+    this.rpcName = rpcName;
+  }
+
+  public GenericResourceApiServicestatusServiceStatus rpcAction(GenericResourceApiRpcActionEnumeration rpcAction) {
+    this.rpcAction = rpcAction;
+    return this;
+  }
+
+  /**
+   * this is the svc-action from the incoming request
+   * @return rpcAction
+  **/
+  @ApiModelProperty(value = "this is the svc-action from the incoming request")
+
+  @Valid
+
+  public GenericResourceApiRpcActionEnumeration getRpcAction() {
+    return rpcAction;
+  }
+
+  public void setRpcAction(GenericResourceApiRpcActionEnumeration rpcAction) {
+    this.rpcAction = rpcAction;
+  }
+
+
+  @Override
+  public boolean equals(java.lang.Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    GenericResourceApiServicestatusServiceStatus genericResourceApiServicestatusServiceStatus = (GenericResourceApiServicestatusServiceStatus) o;
+    return Objects.equals(this.responseCode, genericResourceApiServicestatusServiceStatus.responseCode) &&
+        Objects.equals(this.responseMessage, genericResourceApiServicestatusServiceStatus.responseMessage) &&
+        Objects.equals(this.action, genericResourceApiServicestatusServiceStatus.action) &&
+        Objects.equals(this.responseTimestamp, genericResourceApiServicestatusServiceStatus.responseTimestamp) &&
+        Objects.equals(this.requestStatus, genericResourceApiServicestatusServiceStatus.requestStatus) &&
+        Objects.equals(this.finalIndicator, genericResourceApiServicestatusServiceStatus.finalIndicator) &&
+        Objects.equals(this.rpcName, genericResourceApiServicestatusServiceStatus.rpcName) &&
+        Objects.equals(this.rpcAction, genericResourceApiServicestatusServiceStatus.rpcAction);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(responseCode, responseMessage, action, responseTimestamp, requestStatus, finalIndicator, rpcName, rpcAction);
+  }
+
+  @Override
+  public String toString() {
+    StringBuilder sb = new StringBuilder();
+    sb.append("class GenericResourceApiServicestatusServiceStatus {\n");
+    
+    sb.append("    responseCode: ").append(toIndentedString(responseCode)).append("\n");
+    sb.append("    responseMessage: ").append(toIndentedString(responseMessage)).append("\n");
+    sb.append("    action: ").append(toIndentedString(action)).append("\n");
+    sb.append("    responseTimestamp: ").append(toIndentedString(responseTimestamp)).append("\n");
+    sb.append("    requestStatus: ").append(toIndentedString(requestStatus)).append("\n");
+    sb.append("    finalIndicator: ").append(toIndentedString(finalIndicator)).append("\n");
+    sb.append("    rpcName: ").append(toIndentedString(rpcName)).append("\n");
+    sb.append("    rpcAction: ").append(toIndentedString(rpcAction)).append("\n");
+    sb.append("}");
+    return sb.toString();
+  }
+
+  /**
+   * Convert the given object to string with each line indented by 4 spaces
+   * (except the first line).
+   */
+  private String toIndentedString(java.lang.Object o) {
+    if (o == null) {
+      return "null";
+    }
+    return o.toString().replace("\n", "\n    ");
+  }
+}
+
diff --git a/ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/swagger/model/GenericResourceApiServicetopologyServiceTopology.java b/ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/swagger/model/GenericResourceApiServicetopologyServiceTopology.java
new file mode 100644 (file)
index 0000000..1a4a64f
--- /dev/null
@@ -0,0 +1,170 @@
+package org.onap.sdnc.apps.ms.gra.swagger.model;
+
+import java.util.Objects;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonRootName;
+import com.google.gson.annotations.JsonAdapter;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiOnapModelInformation;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiOnapmodelinformationOnapModelInformation;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiServiceAssignments;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiServiceParameters;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiServiceTopologyIdentifier;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiServiceassignmentsServiceAssignments;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiServiceparametersServiceParameters;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiServicetopologyidentifierServiceTopologyIdentifier;
+import org.springframework.validation.annotation.Validated;
+import javax.validation.Valid;
+import javax.validation.constraints.*;
+
+/**
+ * GenericResourceApiServicetopologyServiceTopology
+ */
+@Validated
+@javax.annotation.Generated(value = "io.swagger.codegen.languages.SpringCodegen", date = "2021-07-13T13:26:44.236-04:00")
+@JsonRootName("service-topology")
+public class GenericResourceApiServicetopologyServiceTopology   {
+  @JsonProperty("onap-model-information")
+  private GenericResourceApiOnapmodelinformationOnapModelInformation onapModelInformation = null;
+
+  @JsonProperty("service-assignments")
+  private GenericResourceApiServiceassignmentsServiceAssignments serviceAssignments = null;
+
+  @JsonProperty("service-parameters")
+  private GenericResourceApiServiceparametersServiceParameters serviceParameters = null;
+
+  @JsonProperty("service-topology-identifier")
+  private GenericResourceApiServicetopologyidentifierServiceTopologyIdentifier serviceTopologyIdentifier = null;
+
+  public GenericResourceApiServicetopologyServiceTopology onapModelInformation(GenericResourceApiOnapmodelinformationOnapModelInformation onapModelInformation) {
+    this.onapModelInformation = onapModelInformation;
+    return this;
+  }
+
+  /**
+   * Get onapModelInformation
+   * @return onapModelInformation
+  **/
+  @ApiModelProperty(value = "")
+
+  @Valid
+
+  public GenericResourceApiOnapmodelinformationOnapModelInformation getOnapModelInformation() {
+    return onapModelInformation;
+  }
+
+  public void setOnapModelInformation(GenericResourceApiOnapmodelinformationOnapModelInformation onapModelInformation) {
+    this.onapModelInformation = onapModelInformation;
+  }
+
+  public GenericResourceApiServicetopologyServiceTopology serviceAssignments(GenericResourceApiServiceassignmentsServiceAssignments serviceAssignments) {
+    this.serviceAssignments = serviceAssignments;
+    return this;
+  }
+
+  /**
+   * Get serviceAssignments
+   * @return serviceAssignments
+  **/
+  @ApiModelProperty(value = "")
+
+  @Valid
+
+  public GenericResourceApiServiceassignmentsServiceAssignments getServiceAssignments() {
+    return serviceAssignments;
+  }
+
+  public void setServiceAssignments(GenericResourceApiServiceassignmentsServiceAssignments serviceAssignments) {
+    this.serviceAssignments = serviceAssignments;
+  }
+
+  public GenericResourceApiServicetopologyServiceTopology serviceParameters(GenericResourceApiServiceparametersServiceParameters serviceParameters) {
+    this.serviceParameters = serviceParameters;
+    return this;
+  }
+
+  /**
+   * Get serviceParameters
+   * @return serviceParameters
+  **/
+  @ApiModelProperty(value = "")
+
+  @Valid
+
+  public GenericResourceApiServiceparametersServiceParameters getServiceParameters() {
+    return serviceParameters;
+  }
+
+  public void setServiceParameters(GenericResourceApiServiceparametersServiceParameters serviceParameters) {
+    this.serviceParameters = serviceParameters;
+  }
+
+  public GenericResourceApiServicetopologyServiceTopology serviceTopologyIdentifier(GenericResourceApiServicetopologyidentifierServiceTopologyIdentifier serviceTopologyIdentifier) {
+    this.serviceTopologyIdentifier = serviceTopologyIdentifier;
+    return this;
+  }
+
+  /**
+   * Get serviceTopologyIdentifier
+   * @return serviceTopologyIdentifier
+  **/
+  @ApiModelProperty(value = "")
+
+  @Valid
+
+  public GenericResourceApiServicetopologyidentifierServiceTopologyIdentifier getServiceTopologyIdentifier() {
+    return serviceTopologyIdentifier;
+  }
+
+  public void setServiceTopologyIdentifier(GenericResourceApiServicetopologyidentifierServiceTopologyIdentifier serviceTopologyIdentifier) {
+    this.serviceTopologyIdentifier = serviceTopologyIdentifier;
+  }
+
+
+  @Override
+  public boolean equals(java.lang.Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    GenericResourceApiServicetopologyServiceTopology genericResourceApiServicetopologyServiceTopology = (GenericResourceApiServicetopologyServiceTopology) o;
+    return Objects.equals(this.onapModelInformation, genericResourceApiServicetopologyServiceTopology.onapModelInformation) &&
+        Objects.equals(this.serviceAssignments, genericResourceApiServicetopologyServiceTopology.serviceAssignments) &&
+        Objects.equals(this.serviceParameters, genericResourceApiServicetopologyServiceTopology.serviceParameters) &&
+        Objects.equals(this.serviceTopologyIdentifier, genericResourceApiServicetopologyServiceTopology.serviceTopologyIdentifier);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(onapModelInformation, serviceAssignments, serviceParameters, serviceTopologyIdentifier);
+  }
+
+  @Override
+  public String toString() {
+    StringBuilder sb = new StringBuilder();
+    sb.append("class GenericResourceApiServicetopologyServiceTopology {\n");
+    
+    sb.append("    onapModelInformation: ").append(toIndentedString(onapModelInformation)).append("\n");
+    sb.append("    serviceAssignments: ").append(toIndentedString(serviceAssignments)).append("\n");
+    sb.append("    serviceParameters: ").append(toIndentedString(serviceParameters)).append("\n");
+    sb.append("    serviceTopologyIdentifier: ").append(toIndentedString(serviceTopologyIdentifier)).append("\n");
+    sb.append("}");
+    return sb.toString();
+  }
+
+  /**
+   * Convert the given object to string with each line indented by 4 spaces
+   * (except the first line).
+   */
+  private String toIndentedString(java.lang.Object o) {
+    if (o == null) {
+      return "null";
+    }
+    return o.toString().replace("\n", "\n    ");
+  }
+}
+
diff --git a/ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/swagger/model/GenericResourceApiVfmoduletopologyVfModuleTopology.java b/ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/swagger/model/GenericResourceApiVfmoduletopologyVfModuleTopology.java
new file mode 100644 (file)
index 0000000..989a179
--- /dev/null
@@ -0,0 +1,294 @@
+package org.onap.sdnc.apps.ms.gra.swagger.model;
+
+import java.util.Objects;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonRootName;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiOnapModelInformation;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiOnapmodelinformationOnapModelInformation;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiParam;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiRegionIdentifier;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiVfModuleAssignments;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiVfModuleTopologyIdentifier;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiVfmoduleassignmentsVfModuleAssignments;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiVfmoduletopologyidentifierVfModuleTopologyIdentifier;
+import org.springframework.validation.annotation.Validated;
+import javax.validation.Valid;
+import javax.validation.constraints.*;
+
+/**
+ * GenericResourceApiVfmoduletopologyVfModuleTopology
+ */
+@Validated
+@javax.annotation.Generated(value = "io.swagger.codegen.languages.SpringCodegen", date = "2021-07-13T13:26:44.236-04:00")
+@JsonRootName("vf-module-topology")
+public class GenericResourceApiVfmoduletopologyVfModuleTopology   {
+  @JsonProperty("onap-model-information")
+  private GenericResourceApiOnapmodelinformationOnapModelInformation onapModelInformation = null;
+
+  @JsonProperty("aic-clli")
+  private String aicClli = null;
+
+  @JsonProperty("aic-cloud-region")
+  private String aicCloudRegion = null;
+
+  @JsonProperty("cloud-owner")
+  private String cloudOwner = null;
+
+  @JsonProperty("tenant")
+  private String tenant = null;
+
+  @JsonProperty("vf-module-assignments")
+  private GenericResourceApiVfmoduleassignmentsVfModuleAssignments vfModuleAssignments = null;
+
+  @JsonProperty("vf-module-topology-identifier")
+  private GenericResourceApiVfmoduletopologyidentifierVfModuleTopologyIdentifier vfModuleTopologyIdentifier = null;
+
+  @JsonProperty("vf-module-parameters")
+  private GenericResourceApiParam vfModuleParameters = null;
+
+  @JsonProperty("sdnc-generated-cloud-resources")
+  private Boolean sdncGeneratedCloudResources = null;
+
+  public GenericResourceApiVfmoduletopologyVfModuleTopology onapModelInformation(GenericResourceApiOnapmodelinformationOnapModelInformation onapModelInformation) {
+    this.onapModelInformation = onapModelInformation;
+    return this;
+  }
+
+  /**
+   * Get onapModelInformation
+   * @return onapModelInformation
+  **/
+  @ApiModelProperty(value = "")
+
+  @Valid
+
+  public GenericResourceApiOnapmodelinformationOnapModelInformation getOnapModelInformation() {
+    return onapModelInformation;
+  }
+
+  public void setOnapModelInformation(GenericResourceApiOnapmodelinformationOnapModelInformation onapModelInformation) {
+    this.onapModelInformation = onapModelInformation;
+  }
+
+  public GenericResourceApiVfmoduletopologyVfModuleTopology aicClli(String aicClli) {
+    this.aicClli = aicClli;
+    return this;
+  }
+
+  /**
+   * Not expected to be used
+   * @return aicClli
+  **/
+  @ApiModelProperty(value = "Not expected to be used")
+
+
+  public String getAicClli() {
+    return aicClli;
+  }
+
+  public void setAicClli(String aicClli) {
+    this.aicClli = aicClli;
+  }
+
+  public GenericResourceApiVfmoduletopologyVfModuleTopology aicCloudRegion(String aicCloudRegion) {
+    this.aicCloudRegion = aicCloudRegion;
+    return this;
+  }
+
+  /**
+   * The AIC cloud region which maps to contrail versions
+   * @return aicCloudRegion
+  **/
+  @ApiModelProperty(value = "The AIC cloud region which maps to contrail versions")
+
+
+  public String getAicCloudRegion() {
+    return aicCloudRegion;
+  }
+
+  public void setAicCloudRegion(String aicCloudRegion) {
+    this.aicCloudRegion = aicCloudRegion;
+  }
+
+  public GenericResourceApiVfmoduletopologyVfModuleTopology cloudOwner(String cloudOwner) {
+    this.cloudOwner = cloudOwner;
+    return this;
+  }
+
+  /**
+   * Get cloudOwner
+   * @return cloudOwner
+  **/
+  @ApiModelProperty(value = "")
+
+
+  public String getCloudOwner() {
+    return cloudOwner;
+  }
+
+  public void setCloudOwner(String cloudOwner) {
+    this.cloudOwner = cloudOwner;
+  }
+
+  public GenericResourceApiVfmoduletopologyVfModuleTopology tenant(String tenant) {
+    this.tenant = tenant;
+    return this;
+  }
+
+  /**
+   * Get tenant
+   * @return tenant
+  **/
+  @ApiModelProperty(value = "")
+
+
+  public String getTenant() {
+    return tenant;
+  }
+
+  public void setTenant(String tenant) {
+    this.tenant = tenant;
+  }
+
+  public GenericResourceApiVfmoduletopologyVfModuleTopology vfModuleAssignments(GenericResourceApiVfmoduleassignmentsVfModuleAssignments vfModuleAssignments) {
+    this.vfModuleAssignments = vfModuleAssignments;
+    return this;
+  }
+
+  /**
+   * Get vfModuleAssignments
+   * @return vfModuleAssignments
+  **/
+  @ApiModelProperty(value = "")
+
+  @Valid
+
+  public GenericResourceApiVfmoduleassignmentsVfModuleAssignments getVfModuleAssignments() {
+    return vfModuleAssignments;
+  }
+
+  public void setVfModuleAssignments(GenericResourceApiVfmoduleassignmentsVfModuleAssignments vfModuleAssignments) {
+    this.vfModuleAssignments = vfModuleAssignments;
+  }
+
+  public GenericResourceApiVfmoduletopologyVfModuleTopology vfModuleTopologyIdentifier(GenericResourceApiVfmoduletopologyidentifierVfModuleTopologyIdentifier vfModuleTopologyIdentifier) {
+    this.vfModuleTopologyIdentifier = vfModuleTopologyIdentifier;
+    return this;
+  }
+
+  /**
+   * Get vfModuleTopologyIdentifier
+   * @return vfModuleTopologyIdentifier
+  **/
+  @ApiModelProperty(value = "")
+
+  @Valid
+
+  public GenericResourceApiVfmoduletopologyidentifierVfModuleTopologyIdentifier getVfModuleTopologyIdentifier() {
+    return vfModuleTopologyIdentifier;
+  }
+
+  public void setVfModuleTopologyIdentifier(GenericResourceApiVfmoduletopologyidentifierVfModuleTopologyIdentifier vfModuleTopologyIdentifier) {
+    this.vfModuleTopologyIdentifier = vfModuleTopologyIdentifier;
+  }
+
+  public GenericResourceApiVfmoduletopologyVfModuleTopology vfModuleParameters(GenericResourceApiParam vfModuleParameters) {
+    this.vfModuleParameters = vfModuleParameters;
+    return this;
+  }
+
+  /**
+   * Get vfModuleParameters
+   * @return vfModuleParameters
+  **/
+  @ApiModelProperty(value = "")
+
+  @Valid
+
+  public GenericResourceApiParam getVfModuleParameters() {
+    return vfModuleParameters;
+  }
+
+  public void setVfModuleParameters(GenericResourceApiParam vfModuleParameters) {
+    this.vfModuleParameters = vfModuleParameters;
+  }
+
+  public GenericResourceApiVfmoduletopologyVfModuleTopology sdncGeneratedCloudResources(Boolean sdncGeneratedCloudResources) {
+    this.sdncGeneratedCloudResources = sdncGeneratedCloudResources;
+    return this;
+  }
+
+  /**
+   * Indicate if source is sdnc-generated-cloud-resources.When true, the parameters are literal HEAT template parameter names;When false, the parameters need to be converted to HEAT format
+   * @return sdncGeneratedCloudResources
+  **/
+  @ApiModelProperty(value = "Indicate if source is sdnc-generated-cloud-resources.When true, the parameters are literal HEAT template parameter names;When false, the parameters need to be converted to HEAT format")
+
+
+  public Boolean isSdncGeneratedCloudResources() {
+    return sdncGeneratedCloudResources;
+  }
+
+  public void setSdncGeneratedCloudResources(Boolean sdncGeneratedCloudResources) {
+    this.sdncGeneratedCloudResources = sdncGeneratedCloudResources;
+  }
+
+
+  @Override
+  public boolean equals(java.lang.Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    GenericResourceApiVfmoduletopologyVfModuleTopology genericResourceApiVfmoduletopologyVfModuleTopology = (GenericResourceApiVfmoduletopologyVfModuleTopology) o;
+    return Objects.equals(this.onapModelInformation, genericResourceApiVfmoduletopologyVfModuleTopology.onapModelInformation) &&
+        Objects.equals(this.aicClli, genericResourceApiVfmoduletopologyVfModuleTopology.aicClli) &&
+        Objects.equals(this.aicCloudRegion, genericResourceApiVfmoduletopologyVfModuleTopology.aicCloudRegion) &&
+        Objects.equals(this.cloudOwner, genericResourceApiVfmoduletopologyVfModuleTopology.cloudOwner) &&
+        Objects.equals(this.tenant, genericResourceApiVfmoduletopologyVfModuleTopology.tenant) &&
+        Objects.equals(this.vfModuleAssignments, genericResourceApiVfmoduletopologyVfModuleTopology.vfModuleAssignments) &&
+        Objects.equals(this.vfModuleTopologyIdentifier, genericResourceApiVfmoduletopologyVfModuleTopology.vfModuleTopologyIdentifier) &&
+        Objects.equals(this.vfModuleParameters, genericResourceApiVfmoduletopologyVfModuleTopology.vfModuleParameters) &&
+        Objects.equals(this.sdncGeneratedCloudResources, genericResourceApiVfmoduletopologyVfModuleTopology.sdncGeneratedCloudResources);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(onapModelInformation, aicClli, aicCloudRegion, cloudOwner, tenant, vfModuleAssignments, vfModuleTopologyIdentifier, vfModuleParameters, sdncGeneratedCloudResources);
+  }
+
+  @Override
+  public String toString() {
+    StringBuilder sb = new StringBuilder();
+    sb.append("class GenericResourceApiVfmoduletopologyVfModuleTopology {\n");
+    
+    sb.append("    onapModelInformation: ").append(toIndentedString(onapModelInformation)).append("\n");
+    sb.append("    aicClli: ").append(toIndentedString(aicClli)).append("\n");
+    sb.append("    aicCloudRegion: ").append(toIndentedString(aicCloudRegion)).append("\n");
+    sb.append("    cloudOwner: ").append(toIndentedString(cloudOwner)).append("\n");
+    sb.append("    tenant: ").append(toIndentedString(tenant)).append("\n");
+    sb.append("    vfModuleAssignments: ").append(toIndentedString(vfModuleAssignments)).append("\n");
+    sb.append("    vfModuleTopologyIdentifier: ").append(toIndentedString(vfModuleTopologyIdentifier)).append("\n");
+    sb.append("    vfModuleParameters: ").append(toIndentedString(vfModuleParameters)).append("\n");
+    sb.append("    sdncGeneratedCloudResources: ").append(toIndentedString(sdncGeneratedCloudResources)).append("\n");
+    sb.append("}");
+    return sb.toString();
+  }
+
+  /**
+   * Convert the given object to string with each line indented by 4 spaces
+   * (except the first line).
+   */
+  private String toIndentedString(java.lang.Object o) {
+    if (o == null) {
+      return "null";
+    }
+    return o.toString().replace("\n", "\n    ");
+  }
+}
+
diff --git a/ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/swagger/model/GenericResourceApiVnfNetworkData.java b/ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/swagger/model/GenericResourceApiVnfNetworkData.java
new file mode 100644 (file)
index 0000000..c32772d
--- /dev/null
@@ -0,0 +1,286 @@
+package org.onap.sdnc.apps.ms.gra.swagger.model;
+
+import java.util.Objects;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonRootName;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiRelatedNetwork;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiVnfnetworkdataSubnetsData;
+import org.springframework.validation.annotation.Validated;
+import javax.validation.Valid;
+import javax.validation.constraints.*;
+
+/**
+ * GenericResourceApiVnfNetworkData
+ */
+@Validated
+@javax.annotation.Generated(value = "io.swagger.codegen.languages.SpringCodegen", date = "2021-07-26T10:54:31.626-04:00")
+@JsonRootName("vnf-network")
+public class GenericResourceApiVnfNetworkData   {
+  @JsonProperty("related-networks")
+  private GenericResourceApiRelatedNetwork relatedNetworks = null;
+
+  @JsonProperty("network-role")
+  private String networkRole = null;
+
+  @JsonProperty("is-trunked")
+  private Boolean isTrunked = null;
+
+  @JsonProperty("network-id")
+  private String networkId = null;
+
+  @JsonProperty("subnets-data")
+  private GenericResourceApiVnfnetworkdataSubnetsData subnetsData = null;
+
+  @JsonProperty("contrail-network-fqdn")
+  private String contrailNetworkFqdn = null;
+
+  @JsonProperty("network-name")
+  private String networkName = null;
+
+  @JsonProperty("segmentation-id")
+  private String segmentationId = null;
+
+  @JsonProperty("neutron-id")
+  private String neutronId = null;
+
+  public GenericResourceApiVnfNetworkData relatedNetworks(GenericResourceApiRelatedNetwork relatedNetworks) {
+    this.relatedNetworks = relatedNetworks;
+    return this;
+  }
+
+  /**
+   * Get relatedNetworks
+   * @return relatedNetworks
+  **/
+  @ApiModelProperty(value = "")
+
+  @Valid
+
+  public GenericResourceApiRelatedNetwork getRelatedNetworks() {
+    return relatedNetworks;
+  }
+
+  public void setRelatedNetworks(GenericResourceApiRelatedNetwork relatedNetworks) {
+    this.relatedNetworks = relatedNetworks;
+  }
+
+  public GenericResourceApiVnfNetworkData networkRole(String networkRole) {
+    this.networkRole = networkRole;
+    return this;
+  }
+
+  /**
+   * A Network Role to which a VNF must connect
+   * @return networkRole
+  **/
+  @ApiModelProperty(value = "A Network Role to which a VNF must connect")
+
+
+  public String getNetworkRole() {
+    return networkRole;
+  }
+
+  public void setNetworkRole(String networkRole) {
+    this.networkRole = networkRole;
+  }
+
+  public GenericResourceApiVnfNetworkData isTrunked(Boolean isTrunked) {
+    this.isTrunked = isTrunked;
+    return this;
+  }
+
+  /**
+   * Get isTrunked
+   * @return isTrunked
+  **/
+  @ApiModelProperty(value = "")
+
+
+  public Boolean isIsTrunked() {
+    return isTrunked;
+  }
+
+  public void setIsTrunked(Boolean isTrunked) {
+    this.isTrunked = isTrunked;
+  }
+
+  public GenericResourceApiVnfNetworkData networkId(String networkId) {
+    this.networkId = networkId;
+    return this;
+  }
+
+  /**
+   * Unique Neutron UUID of an instance of the network role 
+   * @return networkId
+  **/
+  @ApiModelProperty(value = "Unique Neutron UUID of an instance of the network role ")
+
+
+  public String getNetworkId() {
+    return networkId;
+  }
+
+  public void setNetworkId(String networkId) {
+    this.networkId = networkId;
+  }
+
+  public GenericResourceApiVnfNetworkData subnetsData(GenericResourceApiVnfnetworkdataSubnetsData subnetsData) {
+    this.subnetsData = subnetsData;
+    return this;
+  }
+
+  /**
+   * Get subnetsData
+   * @return subnetsData
+  **/
+  @ApiModelProperty(value = "")
+
+  @Valid
+
+  public GenericResourceApiVnfnetworkdataSubnetsData getSubnetsData() {
+    return subnetsData;
+  }
+
+  public void setSubnetsData(GenericResourceApiVnfnetworkdataSubnetsData subnetsData) {
+    this.subnetsData = subnetsData;
+  }
+
+  public GenericResourceApiVnfNetworkData contrailNetworkFqdn(String contrailNetworkFqdn) {
+    this.contrailNetworkFqdn = contrailNetworkFqdn;
+    return this;
+  }
+
+  /**
+   * contrail network policy object
+   * @return contrailNetworkFqdn
+  **/
+  @ApiModelProperty(value = "contrail network policy object")
+
+
+  public String getContrailNetworkFqdn() {
+    return contrailNetworkFqdn;
+  }
+
+  public void setContrailNetworkFqdn(String contrailNetworkFqdn) {
+    this.contrailNetworkFqdn = contrailNetworkFqdn;
+  }
+
+  public GenericResourceApiVnfNetworkData networkName(String networkName) {
+    this.networkName = networkName;
+    return this;
+  }
+
+  /**
+   * Unique Neutron UUID of an instance of the network role 
+   * @return networkName
+  **/
+  @ApiModelProperty(value = "Unique Neutron UUID of an instance of the network role ")
+
+
+  public String getNetworkName() {
+    return networkName;
+  }
+
+  public void setNetworkName(String networkName) {
+    this.networkName = networkName;
+  }
+
+  public GenericResourceApiVnfNetworkData segmentationId(String segmentationId) {
+    this.segmentationId = segmentationId;
+    return this;
+  }
+
+  /**
+   * Get segmentationId
+   * @return segmentationId
+  **/
+  @ApiModelProperty(value = "")
+
+
+  public String getSegmentationId() {
+    return segmentationId;
+  }
+
+  public void setSegmentationId(String segmentationId) {
+    this.segmentationId = segmentationId;
+  }
+
+  public GenericResourceApiVnfNetworkData neutronId(String neutronId) {
+    this.neutronId = neutronId;
+    return this;
+  }
+
+  /**
+   * Unique Neutron UUID of an instance of the network role 
+   * @return neutronId
+  **/
+  @ApiModelProperty(value = "Unique Neutron UUID of an instance of the network role ")
+
+
+  public String getNeutronId() {
+    return neutronId;
+  }
+
+  public void setNeutronId(String neutronId) {
+    this.neutronId = neutronId;
+  }
+
+
+  @Override
+  public boolean equals(java.lang.Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    GenericResourceApiVnfNetworkData genericResourceApiVnfNetworkData = (GenericResourceApiVnfNetworkData) o;
+    return Objects.equals(this.relatedNetworks, genericResourceApiVnfNetworkData.relatedNetworks) &&
+        Objects.equals(this.networkRole, genericResourceApiVnfNetworkData.networkRole) &&
+        Objects.equals(this.isTrunked, genericResourceApiVnfNetworkData.isTrunked) &&
+        Objects.equals(this.networkId, genericResourceApiVnfNetworkData.networkId) &&
+        Objects.equals(this.subnetsData, genericResourceApiVnfNetworkData.subnetsData) &&
+        Objects.equals(this.contrailNetworkFqdn, genericResourceApiVnfNetworkData.contrailNetworkFqdn) &&
+        Objects.equals(this.networkName, genericResourceApiVnfNetworkData.networkName) &&
+        Objects.equals(this.segmentationId, genericResourceApiVnfNetworkData.segmentationId) &&
+        Objects.equals(this.neutronId, genericResourceApiVnfNetworkData.neutronId);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(relatedNetworks, networkRole, isTrunked, networkId, subnetsData, contrailNetworkFqdn, networkName, segmentationId, neutronId);
+  }
+
+  @Override
+  public String toString() {
+    StringBuilder sb = new StringBuilder();
+    sb.append("class GenericResourceApiVnfNetworkData {\n");
+    
+    sb.append("    relatedNetworks: ").append(toIndentedString(relatedNetworks)).append("\n");
+    sb.append("    networkRole: ").append(toIndentedString(networkRole)).append("\n");
+    sb.append("    isTrunked: ").append(toIndentedString(isTrunked)).append("\n");
+    sb.append("    networkId: ").append(toIndentedString(networkId)).append("\n");
+    sb.append("    subnetsData: ").append(toIndentedString(subnetsData)).append("\n");
+    sb.append("    contrailNetworkFqdn: ").append(toIndentedString(contrailNetworkFqdn)).append("\n");
+    sb.append("    networkName: ").append(toIndentedString(networkName)).append("\n");
+    sb.append("    segmentationId: ").append(toIndentedString(segmentationId)).append("\n");
+    sb.append("    neutronId: ").append(toIndentedString(neutronId)).append("\n");
+    sb.append("}");
+    return sb.toString();
+  }
+
+  /**
+   * Convert the given object to string with each line indented by 4 spaces
+   * (except the first line).
+   */
+  private String toIndentedString(java.lang.Object o) {
+    if (o == null) {
+      return "null";
+    }
+    return o.toString().replace("\n", "\n    ");
+  }
+}
+
diff --git a/ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/swagger/model/GenericResourceApiVnfresourceassignmentsVnfresourceassignmentsVnfNetworks.java b/ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/swagger/model/GenericResourceApiVnfresourceassignmentsVnfresourceassignmentsVnfNetworks.java
new file mode 100644 (file)
index 0000000..70fd01a
--- /dev/null
@@ -0,0 +1,95 @@
+package org.onap.sdnc.apps.ms.gra.swagger.model;
+
+import java.util.Objects;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonRootName;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import java.util.ArrayList;
+import java.util.List;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiVnfNetworkData;
+import org.springframework.validation.annotation.Validated;
+import javax.validation.Valid;
+import javax.validation.constraints.*;
+
+/**
+ * GenericResourceApiVnfresourceassignmentsVnfresourceassignmentsVnfNetworks
+ */
+@Validated
+@javax.annotation.Generated(value = "io.swagger.codegen.languages.SpringCodegen", date = "2021-07-26T09:20:20.871-04:00")
+@JsonRootName("vnf-networks")
+public class GenericResourceApiVnfresourceassignmentsVnfresourceassignmentsVnfNetworks   {
+  @JsonProperty("vnf-network")
+  @Valid
+  private List<GenericResourceApiVnfNetworkData> vnfNetwork = null;
+
+  public GenericResourceApiVnfresourceassignmentsVnfresourceassignmentsVnfNetworks vnfNetwork(List<GenericResourceApiVnfNetworkData> vnfNetwork) {
+    this.vnfNetwork = vnfNetwork;
+    return this;
+  }
+
+  public GenericResourceApiVnfresourceassignmentsVnfresourceassignmentsVnfNetworks addVnfNetworkItem(GenericResourceApiVnfNetworkData vnfNetworkItem) {
+    if (this.vnfNetwork == null) {
+      this.vnfNetwork = new ArrayList<>();
+    }
+    this.vnfNetwork.add(vnfNetworkItem);
+    return this;
+  }
+
+  /**
+   * Get vnfNetwork
+   * @return vnfNetwork
+  **/
+  @ApiModelProperty(value = "")
+
+  @Valid
+
+  public List<GenericResourceApiVnfNetworkData> getVnfNetwork() {
+    return vnfNetwork;
+  }
+
+  public void setVnfNetwork(List<GenericResourceApiVnfNetworkData> vnfNetwork) {
+    this.vnfNetwork = vnfNetwork;
+  }
+
+
+  @Override
+  public boolean equals(java.lang.Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    GenericResourceApiVnfresourceassignmentsVnfresourceassignmentsVnfNetworks genericResourceApiVnfresourceassignmentsVnfresourceassignmentsVnfNetworks = (GenericResourceApiVnfresourceassignmentsVnfresourceassignmentsVnfNetworks) o;
+    return Objects.equals(this.vnfNetwork, genericResourceApiVnfresourceassignmentsVnfresourceassignmentsVnfNetworks.vnfNetwork);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(vnfNetwork);
+  }
+
+  @Override
+  public String toString() {
+    StringBuilder sb = new StringBuilder();
+    sb.append("class GenericResourceApiVnfresourceassignmentsVnfresourceassignmentsVnfNetworks {\n");
+    
+    sb.append("    vnfNetwork: ").append(toIndentedString(vnfNetwork)).append("\n");
+    sb.append("}");
+    return sb.toString();
+  }
+
+  /**
+   * Convert the given object to string with each line indented by 4 spaces
+   * (except the first line).
+   */
+  private String toIndentedString(java.lang.Object o) {
+    if (o == null) {
+      return "null";
+    }
+    return o.toString().replace("\n", "\n    ");
+  }
+}
+
diff --git a/ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/swagger/model/GenericResourceApiVnftopologyVnfTopology.java b/ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/swagger/model/GenericResourceApiVnftopologyVnfTopology.java
new file mode 100644 (file)
index 0000000..8b6d221
--- /dev/null
@@ -0,0 +1,294 @@
+package org.onap.sdnc.apps.ms.gra.swagger.model;
+
+import java.util.Objects;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonRootName;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiOnapModelInformation;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiOnapmodelinformationOnapModelInformation;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiParam;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiRegionIdentifier;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiVnfResourceAssignments;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiVnfTopologyIdentifierStructure;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiVnfresourceassignmentsVnfResourceAssignments;
+import org.onap.sdnc.apps.ms.gra.swagger.model.GenericResourceApiVnftopologyidentifierstructureVnfTopologyIdentifierStructure;
+import org.springframework.validation.annotation.Validated;
+import javax.validation.Valid;
+import javax.validation.constraints.*;
+
+/**
+ * GenericResourceApiVnftopologyVnfTopology
+ */
+@Validated
+@javax.annotation.Generated(value = "io.swagger.codegen.languages.SpringCodegen", date = "2021-07-13T13:26:44.236-04:00")
+@JsonRootName("vnf-topology")
+public class GenericResourceApiVnftopologyVnfTopology   {
+  @JsonProperty("onap-model-information")
+  private GenericResourceApiOnapmodelinformationOnapModelInformation onapModelInformation = null;
+
+  @JsonProperty("aic-clli")
+  private String aicClli = null;
+
+  @JsonProperty("aic-cloud-region")
+  private String aicCloudRegion = null;
+
+  @JsonProperty("cloud-owner")
+  private String cloudOwner = null;
+
+  @JsonProperty("tenant")
+  private String tenant = null;
+
+  @JsonProperty("vnf-resource-assignments")
+  private GenericResourceApiVnfresourceassignmentsVnfResourceAssignments vnfResourceAssignments = null;
+
+  @JsonProperty("vnf-topology-identifier-structure")
+  private GenericResourceApiVnftopologyidentifierstructureVnfTopologyIdentifierStructure vnfTopologyIdentifierStructure = null;
+
+  @JsonProperty("vnf-parameters-data")
+  private GenericResourceApiParam vnfParametersData = null;
+
+  @JsonProperty("sdnc-generated-cloud-resources")
+  private Boolean sdncGeneratedCloudResources = null;
+
+  public GenericResourceApiVnftopologyVnfTopology onapModelInformation(GenericResourceApiOnapmodelinformationOnapModelInformation onapModelInformation) {
+    this.onapModelInformation = onapModelInformation;
+    return this;
+  }
+
+  /**
+   * Get onapModelInformation
+   * @return onapModelInformation
+  **/
+  @ApiModelProperty(value = "")
+
+  @Valid
+
+  public GenericResourceApiOnapmodelinformationOnapModelInformation getOnapModelInformation() {
+    return onapModelInformation;
+  }
+
+  public void setOnapModelInformation(GenericResourceApiOnapmodelinformationOnapModelInformation onapModelInformation) {
+    this.onapModelInformation = onapModelInformation;
+  }
+
+  public GenericResourceApiVnftopologyVnfTopology aicClli(String aicClli) {
+    this.aicClli = aicClli;
+    return this;
+  }
+
+  /**
+   * Not expected to be used
+   * @return aicClli
+  **/
+  @ApiModelProperty(value = "Not expected to be used")
+
+
+  public String getAicClli() {
+    return aicClli;
+  }
+
+  public void setAicClli(String aicClli) {
+    this.aicClli = aicClli;
+  }
+
+  public GenericResourceApiVnftopologyVnfTopology aicCloudRegion(String aicCloudRegion) {
+    this.aicCloudRegion = aicCloudRegion;
+    return this;
+  }
+
+  /**
+   * The AIC cloud region which maps to contrail versions
+   * @return aicCloudRegion
+  **/
+  @ApiModelProperty(value = "The AIC cloud region which maps to contrail versions")
+
+
+  public String getAicCloudRegion() {
+    return aicCloudRegion;
+  }
+
+  public void setAicCloudRegion(String aicCloudRegion) {
+    this.aicCloudRegion = aicCloudRegion;
+  }
+
+  public GenericResourceApiVnftopologyVnfTopology cloudOwner(String cloudOwner) {
+    this.cloudOwner = cloudOwner;
+    return this;
+  }
+
+  /**
+   * Get cloudOwner
+   * @return cloudOwner
+  **/
+  @ApiModelProperty(value = "")
+
+
+  public String getCloudOwner() {
+    return cloudOwner;
+  }
+
+  public void setCloudOwner(String cloudOwner) {
+    this.cloudOwner = cloudOwner;
+  }
+
+  public GenericResourceApiVnftopologyVnfTopology tenant(String tenant) {
+    this.tenant = tenant;
+    return this;
+  }
+
+  /**
+   * Get tenant
+   * @return tenant
+  **/
+  @ApiModelProperty(value = "")
+
+
+  public String getTenant() {
+    return tenant;
+  }
+
+  public void setTenant(String tenant) {
+    this.tenant = tenant;
+  }
+
+  public GenericResourceApiVnftopologyVnfTopology vnfResourceAssignments(GenericResourceApiVnfresourceassignmentsVnfResourceAssignments vnfResourceAssignments) {
+    this.vnfResourceAssignments = vnfResourceAssignments;
+    return this;
+  }
+
+  /**
+   * Get vnfResourceAssignments
+   * @return vnfResourceAssignments
+  **/
+  @ApiModelProperty(value = "")
+
+  @Valid
+
+  public GenericResourceApiVnfresourceassignmentsVnfResourceAssignments getVnfResourceAssignments() {
+    return vnfResourceAssignments;
+  }
+
+  public void setVnfResourceAssignments(GenericResourceApiVnfresourceassignmentsVnfResourceAssignments vnfResourceAssignments) {
+    this.vnfResourceAssignments = vnfResourceAssignments;
+  }
+
+  public GenericResourceApiVnftopologyVnfTopology vnfTopologyIdentifierStructure(GenericResourceApiVnftopologyidentifierstructureVnfTopologyIdentifierStructure vnfTopologyIdentifierStructure) {
+    this.vnfTopologyIdentifierStructure = vnfTopologyIdentifierStructure;
+    return this;
+  }
+
+  /**
+   * Get vnfTopologyIdentifierStructure
+   * @return vnfTopologyIdentifierStructure
+  **/
+  @ApiModelProperty(value = "")
+
+  @Valid
+
+  public GenericResourceApiVnftopologyidentifierstructureVnfTopologyIdentifierStructure getVnfTopologyIdentifierStructure() {
+    return vnfTopologyIdentifierStructure;
+  }
+
+  public void setVnfTopologyIdentifierStructure(GenericResourceApiVnftopologyidentifierstructureVnfTopologyIdentifierStructure vnfTopologyIdentifierStructure) {
+    this.vnfTopologyIdentifierStructure = vnfTopologyIdentifierStructure;
+  }
+
+  public GenericResourceApiVnftopologyVnfTopology vnfParametersData(GenericResourceApiParam vnfParametersData) {
+    this.vnfParametersData = vnfParametersData;
+    return this;
+  }
+
+  /**
+   * Get vnfParametersData
+   * @return vnfParametersData
+  **/
+  @ApiModelProperty(value = "")
+
+  @Valid
+
+  public GenericResourceApiParam getVnfParametersData() {
+    return vnfParametersData;
+  }
+
+  public void setVnfParametersData(GenericResourceApiParam vnfParametersData) {
+    this.vnfParametersData = vnfParametersData;
+  }
+
+  public GenericResourceApiVnftopologyVnfTopology sdncGeneratedCloudResources(Boolean sdncGeneratedCloudResources) {
+    this.sdncGeneratedCloudResources = sdncGeneratedCloudResources;
+    return this;
+  }
+
+  /**
+   * Indicate if source is sdnc generated cloud param. When true, the parameters are literal HEAT template parameter names;When false, the parameters need to be converted to HEAT format
+   * @return sdncGeneratedCloudResources
+  **/
+  @ApiModelProperty(value = "Indicate if source is sdnc generated cloud param. When true, the parameters are literal HEAT template parameter names;When false, the parameters need to be converted to HEAT format")
+
+
+  public Boolean isSdncGeneratedCloudResources() {
+    return sdncGeneratedCloudResources;
+  }
+
+  public void setSdncGeneratedCloudResources(Boolean sdncGeneratedCloudResources) {
+    this.sdncGeneratedCloudResources = sdncGeneratedCloudResources;
+  }
+
+
+  @Override
+  public boolean equals(java.lang.Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    GenericResourceApiVnftopologyVnfTopology genericResourceApiVnftopologyVnfTopology = (GenericResourceApiVnftopologyVnfTopology) o;
+    return Objects.equals(this.onapModelInformation, genericResourceApiVnftopologyVnfTopology.onapModelInformation) &&
+        Objects.equals(this.aicClli, genericResourceApiVnftopologyVnfTopology.aicClli) &&
+        Objects.equals(this.aicCloudRegion, genericResourceApiVnftopologyVnfTopology.aicCloudRegion) &&
+        Objects.equals(this.cloudOwner, genericResourceApiVnftopologyVnfTopology.cloudOwner) &&
+        Objects.equals(this.tenant, genericResourceApiVnftopologyVnfTopology.tenant) &&
+        Objects.equals(this.vnfResourceAssignments, genericResourceApiVnftopologyVnfTopology.vnfResourceAssignments) &&
+        Objects.equals(this.vnfTopologyIdentifierStructure, genericResourceApiVnftopologyVnfTopology.vnfTopologyIdentifierStructure) &&
+        Objects.equals(this.vnfParametersData, genericResourceApiVnftopologyVnfTopology.vnfParametersData) &&
+        Objects.equals(this.sdncGeneratedCloudResources, genericResourceApiVnftopologyVnfTopology.sdncGeneratedCloudResources);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(onapModelInformation, aicClli, aicCloudRegion, cloudOwner, tenant, vnfResourceAssignments, vnfTopologyIdentifierStructure, vnfParametersData, sdncGeneratedCloudResources);
+  }
+
+  @Override
+  public String toString() {
+    StringBuilder sb = new StringBuilder();
+    sb.append("class GenericResourceApiVnftopologyVnfTopology {\n");
+    
+    sb.append("    onapModelInformation: ").append(toIndentedString(onapModelInformation)).append("\n");
+    sb.append("    aicClli: ").append(toIndentedString(aicClli)).append("\n");
+    sb.append("    aicCloudRegion: ").append(toIndentedString(aicCloudRegion)).append("\n");
+    sb.append("    cloudOwner: ").append(toIndentedString(cloudOwner)).append("\n");
+    sb.append("    tenant: ").append(toIndentedString(tenant)).append("\n");
+    sb.append("    vnfResourceAssignments: ").append(toIndentedString(vnfResourceAssignments)).append("\n");
+    sb.append("    vnfTopologyIdentifierStructure: ").append(toIndentedString(vnfTopologyIdentifierStructure)).append("\n");
+    sb.append("    vnfParametersData: ").append(toIndentedString(vnfParametersData)).append("\n");
+    sb.append("    sdncGeneratedCloudResources: ").append(toIndentedString(sdncGeneratedCloudResources)).append("\n");
+    sb.append("}");
+    return sb.toString();
+  }
+
+  /**
+   * Convert the given object to string with each line indented by 4 spaces
+   * (except the first line).
+   */
+  private String toIndentedString(java.lang.Object o) {
+    if (o == null) {
+      return "null";
+    }
+    return o.toString().replace("\n", "\n    ");
+  }
+}
+
diff --git a/ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/swagger/model/GenericResourceApiVpnbindingsVpnBindings.java b/ms/gra/gra-app/src/main/java/org/onap/sdnc/apps/ms/gra/swagger/model/GenericResourceApiVpnbindingsVpnBindings.java
new file mode 100644 (file)
index 0000000..72463f9
--- /dev/null
@@ -0,0 +1,182 @@
+package org.onap.sdnc.apps.ms.gra.swagger.model;
+
+import java.util.Objects;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonRootName;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import org.springframework.validation.annotation.Validated;
+import javax.validation.Valid;
+import javax.validation.constraints.*;
+
+/**
+ * GenericResourceApiVpnbindingsVpnBindings
+ */
+@Validated
+@javax.annotation.Generated(value = "io.swagger.codegen.languages.SpringCodegen", date = "2021-07-23T12:02:01.518-04:00")
+@JsonRootName("vpn-bindings")
+public class GenericResourceApiVpnbindingsVpnBindings   {
+  @JsonProperty("vpn-name")
+  private String vpnName = null;
+
+  @JsonProperty("vpn-binding-id")
+  private String vpnBindingId = null;
+
+  @JsonProperty("route-target-role")
+  private String routeTargetRole = null;
+
+  @JsonProperty("aic-zone")
+  private String aicZone = null;
+
+  @JsonProperty("global-route-target")
+  private String globalRouteTarget = null;
+
+  public GenericResourceApiVpnbindingsVpnBindings vpnName(String vpnName) {
+    this.vpnName = vpnName;
+    return this;
+  }
+
+  /**
+   * Get vpnName
+   * @return vpnName
+  **/
+  @ApiModelProperty(value = "")
+
+
+  public String getVpnName() {
+    return vpnName;
+  }
+
+  public void setVpnName(String vpnName) {
+    this.vpnName = vpnName;
+  }
+
+  public GenericResourceApiVpnbindingsVpnBindings vpnBindingId(String vpnBindingId) {
+    this.vpnBindingId = vpnBindingId;
+    return this;
+  }
+
+  /**
+   * Get vpnBindingId
+   * @return vpnBindingId
+  **/
+  @ApiModelProperty(value = "")
+
+
+  public String getVpnBindingId() {
+    return vpnBindingId;
+  }
+
+  public void setVpnBindingId(String vpnBindingId) {
+    this.vpnBindingId = vpnBindingId;
+  }
+
+  public GenericResourceApiVpnbindingsVpnBindings routeTargetRole(String routeTargetRole) {
+    this.routeTargetRole = routeTargetRole;
+    return this;
+  }
+
+  /**
+   * Get routeTargetRole
+   * @return routeTargetRole
+  **/
+  @ApiModelProperty(value = "")
+
+
+  public String getRouteTargetRole() {
+    return routeTargetRole;
+  }
+
+  public void setRouteTargetRole(String routeTargetRole) {
+    this.routeTargetRole = routeTargetRole;
+  }
+
+  public GenericResourceApiVpnbindingsVpnBindings aicZone(String aicZone) {
+    this.aicZone = aicZone;
+    return this;
+  }
+
+  /**
+   * AIC Zone the route target associated with
+   * @return aicZone
+  **/
+  @ApiModelProperty(value = "AIC Zone the route target associated with")
+
+
+  public String getAicZone() {
+    return aicZone;
+  }
+
+  public void setAicZone(String aicZone) {
+    this.aicZone = aicZone;
+  }
+
+  public GenericResourceApiVpnbindingsVpnBindings globalRouteTarget(String globalRouteTarget) {
+    this.globalRouteTarget = globalRouteTarget;
+    return this;
+  }
+
+  /**
+   * Get globalRouteTarget
+   * @return globalRouteTarget
+  **/
+  @ApiModelProperty(value = "")
+
+
+  public String getGlobalRouteTarget() {
+    return globalRouteTarget;
+  }
+
+  public void setGlobalRouteTarget(String globalRouteTarget) {
+    this.globalRouteTarget = globalRouteTarget;
+  }
+
+
+  @Override
+  public boolean equals(java.lang.Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    GenericResourceApiVpnbindingsVpnBindings genericResourceApiVpnbindingsVpnBindings = (GenericResourceApiVpnbindingsVpnBindings) o;
+    return Objects.equals(this.vpnName, genericResourceApiVpnbindingsVpnBindings.vpnName) &&
+        Objects.equals(this.vpnBindingId, genericResourceApiVpnbindingsVpnBindings.vpnBindingId) &&
+        Objects.equals(this.routeTargetRole, genericResourceApiVpnbindingsVpnBindings.routeTargetRole) &&
+        Objects.equals(this.aicZone, genericResourceApiVpnbindingsVpnBindings.aicZone) &&
+        Objects.equals(this.globalRouteTarget, genericResourceApiVpnbindingsVpnBindings.globalRouteTarget);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(vpnName, vpnBindingId, routeTargetRole, aicZone, globalRouteTarget);
+  }
+
+  @Override
+  public String toString() {
+    StringBuilder sb = new StringBuilder();
+    sb.append("class GenericResourceApiVpnbindingsVpnBindings {\n");
+    
+    sb.append("    vpnName: ").append(toIndentedString(vpnName)).append("\n");
+    sb.append("    vpnBindingId: ").append(toIndentedString(vpnBindingId)).append("\n");
+    sb.append("    routeTargetRole: ").append(toIndentedString(routeTargetRole)).append("\n");
+    sb.append("    aicZone: ").append(toIndentedString(aicZone)).append("\n");
+    sb.append("    globalRouteTarget: ").append(toIndentedString(globalRouteTarget)).append("\n");
+    sb.append("}");
+    return sb.toString();
+  }
+
+  /**
+   * Convert the given object to string with each line indented by 4 spaces
+   * (except the first line).
+   */
+  private String toIndentedString(java.lang.Object o) {
+    if (o == null) {
+      return "null";
+    }
+    return o.toString().replace("\n", "\n    ");
+  }
+}
+
index 2be250b..b78d486 100644 (file)
@@ -22,3 +22,6 @@ spring.jpa.hibernate.naming.implicit-strategy=org.hibernate.boot.model.naming.Im
 spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
 
 spring.jpa.database=mysql
+swagger-ui.host=${SDNNFT_HOST:localhost}
+swagger-ui.title=SDN-NFT: GRA microservice
+swagger-ui.description=SDN-NFT GRA microservice API documentation
diff --git a/ms/gra/gra-app/src/main/resources/contrail-adaptor.properties b/ms/gra/gra-app/src/main/resources/contrail-adaptor.properties
new file mode 100644 (file)
index 0000000..c6d98f4
--- /dev/null
@@ -0,0 +1,40 @@
+keystone.username=admin
+keystone.password=admin
+tenant.password=admin
+contrail.template.dir=/opt/lsc/restapi/templates
+max.retry.count=3
+retry.wait=5000
+request.timeout=10000
+
+simulateResponse=false
+keystone.dummy.cache=true
+orm.dummy.cache=true
+use.orm=true
+
+cloud.config.use=false
+cloud.config.filename=cloud_config.json
+cloud.config.refresh.timer=1000
+
+#orm.default_keystone_url_version=/v3
+orm.default_keystone_url_version=/v2.0
+orm.default_keystone_version_regex=/[vV][0-9]
+orm.default_orm_url_replace_this=8080
+orm.default_orm_url_replace_with_this=7080
+orm.aic.client=ECOMP-SDNCP
+contrail.url.regex=sdn-l-config
+
+#properties need to create json for policymanager configBody
+configBody.service:NetworkPolicy
+configBody.version:1.3.0.1
+configBody.configName:Search
+configBody.policyScope:SDNC
+configBody.templateVersion:1607
+configBody.location:Search
+configBody.uuid:Search
+configBody.priority:2
+configBody.riskType:low
+configBody.riskLevel:2
+configBody.guard:True
+
+aic.contrail.proxy=none
+aic.keystone.proxy=none
diff --git a/ms/gra/gra-app/src/main/resources/contrail-api-path.properties b/ms/gra/gra-app/src/main/resources/contrail-api-path.properties
new file mode 100644 (file)
index 0000000..4c04d0e
--- /dev/null
@@ -0,0 +1,59 @@
+network-policy.create.path=/network-policys
+network-policy.create.method=NetworkPolicy.createNetworkPolicy
+network-policy.create.hasTemplateFile=Y
+
+network-policy.get.path=/network-policy/{contrail-network-policy-id}
+network-policy.get.method=NetworkPolicy.getNetworkPolicy
+network-policy.get.hasTemplateFile=N
+
+network-policy.delete.path=/network-policy/{contrail-network-policy-id}
+network-policy.delete.method=NetworkPolicy.deleteNetworkPolicy
+network-policy.delete.hasTemplateFile=N
+
+network-policy.update.path=/network-policy/{contrail-network-policy-id}
+network-policy.update.method=NetworkPolicy.updateNetworkPolicy
+network-policy.update.hasTemplateFile=Y
+
+network-policy.apply.path=/virtual-network/{contrail-virtual-network-id}
+network-policy.apply.method=NetworkPolicy.applyNetworkPolicy
+network-policy.apply.hasTemplateFile=N
+
+network-policy.remove.path=/virtual-network/{contrail-virtual-network-id}
+network-policy.remove.method=NetworkPolicy.removeNetworkPolicy
+network-policy.remove.hasTemplateFile=N
+
+virtual-networks.get.path=/virtual-networks
+virtual-networks.get.method=NetworkPolicy.getVirtualNetworks
+virtual-networks.get.hasTemplateFile=N
+
+virtual-network.get.path=/virtual-network/{contrail-virtual-network-id}
+virtual-network.get.method=NetworkPolicy.getVirtualNetwork
+virtual-network.get.hasTemplateFile=N
+
+fqname-to-uuid.get.path=/fqname-to-id
+fqname-to-uuid.get.method=NetworkPolicy.getFqNameToUuid
+fqname-to-uuid.get.hasTemplateFile=Y
+
+id-to-fqname.get.path=/id-to-fqname
+id-to-fqname.get.method=NetworkPolicy.getIdToFqName
+id-to-fqname.get.hasTemplateFile=N
+
+virtual-machine-interface.get.path=/virtual-machine-interface/{contrail-virtual-machine-interface-id}
+virtual-machine-interface.get.method=PortMirroring.getVirtualMachineInterface
+virtual-machine-interface.get.hasTemplateFile=N
+
+port-mirroring.enable.path=/virtual-machine-interface/{contrail-virtual-machine-interface-id}
+port-mirroring.enable.method=PortMirroring.enablePortMirroring
+port-mirroring.enable.hasTemplateFile=Y
+
+port-mirroring.disable.path=/virtual-machine-interface/{contrail-virtual-machine-interface-id}
+port-mirroring.disable.method=PortMirroring.disablePortMirroring
+port-mirroring.disable.hasTemplateFile=Y
+
+subnet.add.path=/virtual-network/{contrail-virtual-network-id}
+subnet.add.method=NetworkPolicy.addSubnet
+subnet.add.hasTemplateFile=N
+
+subnet.delete.path=/virtual-network/{contrail-virtual-network-id}
+subnet.delete.method=NetworkPolicy.deleteSubnet
+subnet.delete.hasTemplateFile=N
index 2b75ac8..c8fc398 100644 (file)
@@ -517,3 +517,124 @@ databaseChangeLog:
         - column:
             name: vfModuleData
             type: clob
+- changeSet:
+    id: 20210620-1
+    author: dtimoney@att.com
+    changes:
+    - modifyDataType:
+        - tableName: CONFIG_GRA_CONTRAIL_ROUTE_ALLOTTED_RESOURCES
+        - columnName: allottedResourceStatusResponseMessage
+        - newDataType: varchar(2000)
+    - modifyDataType:
+        - tableName: CONFIG_GRA_PORT_MIRROR_CONFIGURATIONS
+        - columnName: portMirrorConfigurationStatusResponseMessage
+        - newDataType: varchar(2000)
+    - modifyDataType:
+        - tableName: OPERATIONAL_GRA_CONTRAIL_ROUTE_ALLOTTED_RESOURCES
+        - columnName: allottedResourceStatusResponseMessage
+        - newDataType: varchar(2000)
+    - modifyDataType:
+        - tableName: OPERATIONAL_GRA_PORT_MIRROR_CONFIGURATIONS
+        - columnName: portMirrorConfigurationStatusResponseMessage
+        - newDataType: varchar(2000)
+    - modifyDataType:
+        - tableName: CONFIG_GRA_SERVICES
+        - columnName: serviceStatusResponseMessage
+        - newDataType: varchar(2000)
+    - modifyDataType:
+        - tableName: OPERATIONAL_GRA_SERVICES
+        - columnName: serviceStatusResponseMessage
+        - newDataType: varchar(2000)
+
+- changeSet:
+    id: 210806-1
+    author: dtimoney@att.com
+    preConditions:
+      - onFail: MARK_RAN
+      - tableExists:
+          tableName: PRE_LOAD_VNF_DATA
+    changes:
+    - modifyDataType:
+        - tableName: PRE_LOAD_VNF_DATA
+        - columnName: preload_data 
+        - newDataType: clob
+    - modifyDataType:
+        - tableName: PRE_LOAD_VNF_DATA
+        - columnName: eipam_payload
+        - newDataType: clob
+    - modifyDataType:
+        - tableName: PRE_LOAD_VNF_DATA
+        - columnName: gr_api_data
+        - newDataType: clob
+- changeSet:
+    id: 210806-2
+    author: dtimoney@att.com
+    preConditions:
+      - onFail: MARK_RAN
+      - tableExists:
+          tableName: PRE_LOAD_VNF_NETWORK_DATA
+    changes:
+    - modifyDataType:
+        - tableName: PRE_LOAD_VNF_NETWORK_DATA
+        - columnName: preload_data 
+        - newDataType: clob
+    - modifyDataType:
+        - tableName: PRE_LOAD_VNF_NETWORK_DATA
+        - columnName: eipam_payload
+        - newDataType: clob
+    - modifyDataType:
+        - tableName: PRE_LOAD_VNF_NETWORK_DATA
+        - columnName: gr_api_data
+        - newDataType: clob
+- changeSet:
+    id: 20210816-1
+    author: kc1472@att.com
+    preConditions:
+        - onFail: MARK_RAN
+        - not:
+            - tableExists:
+                tableName: KEYSTONE_IDENTITY_SERVICE
+    changes:
+    - createTable:
+        tableName: KEYSTONE_IDENTITY_SERVICE
+        columns:
+        - column:
+            name: cloudRegion
+            type: varchar(255)
+            constraints:
+                nullable: false
+                primaryKey: true
+        - column:
+            name: keystoneUrl
+            type: varchar(255)
+            constraints:
+                nullable: false
+        - column:
+            name: mechId
+            type: varchar(255)
+            constraints:
+                nullable: false
+        - column:
+            name: encryptedPassword
+            type: varchar(255)
+            constraints:
+                nullable: false
+        - column:
+            name: modifiedTimeStamp
+            type: timestamp
+            constraints:
+                nullable: false
+            defaultValueComputed: CURRENT_TIMESTAMP
+
+- changeSet:
+    id: 20211026-1
+    author: la505a@att.com
+    preConditions:
+      - onFail: MARK_RAN
+      - tableExists:
+          tableName: SERVICE_MODEL
+    changes:
+    - modifyDataType:
+        - tableName: SERVICE_MODEL
+        - columnName: filename
+        - newDataType: varchar(255)
diff --git a/ms/gra/gra-app/src/main/resources/eipam.properties b/ms/gra/gra-app/src/main/resources/eipam.properties
new file mode 100644 (file)
index 0000000..09f2b63
--- /dev/null
@@ -0,0 +1,63 @@
+eipam.templateDir=/opt/lsc/restapi/templates/
+
+#mS is new in 1810, URL is driven by DME2
+eipam.service=microservice-router.lpp.att.com/services/microservice_router/v1/routes
+
+#DME proxy does not work in containers(1908), workaround is to call alternate.url
+# 1906/1908 Can be Direct call or LGW to replace DME2
+#1906 Direct call
+#eipam.alternate.url=https://st3-lppajsc.oss.att.com:8666/services/microservice_router/v1/routes
+#1908 LGW to replace DME2
+#eipam.alternate.url=https://eipam1-ipaddress.dev.att.com
+#eipam.rest.urlEndPoint=/eipam/rest/ipassignment/
+eipam.alternate.url=https://eipam-ipaddress1.stage.att.com
+
+# subContext for Direct Call, if used the LGW subContext below need to be commented out
+#eipam.subContext.assign=/eipamIP/assign
+#eipam.subContext.unassign=/eipamIP/unassign
+#eipam.subContext.createPool=/eipamIP/createPool
+#eipam.subContext.deletePool=/eipamIP/deletePool
+#eipam.subContext.getPlanTopology=/eipamIP/topology
+#eipam.subContext.getIPAddress=/eipamIP/getIP
+#eipam.subContext.allocateSubnet=/eipamIP/allocate
+#eipam.subContext.deallocateSubnet=/eipamIP/deallocate
+#eipam.subContext.activateSubnet=/eipamIP/activateSubnet
+#eipam.subContext.ping=/eipamIP/ping
+#eipam.subContext.getPool=/eipamIP/getPool
+#eipam.subContext.examineIP=/eipamIP/examineIP
+
+eipam.httpMethod.assign=PUT
+eipam.httpMethod.unassign=POST
+eipam.httpMethod.createPool=PUT
+eipam.httpMethod.deletePool=POST
+eipam.httpMethod.getPlanTopology=GET
+eipam.httpMethod.getIPAddress=GET
+eipam.httpMethod.allocateSubnet=PUT
+eipam.httpMethod.deallocateSubnet=PUT
+eipam.httpMethod.activateSubnet=PUT
+eipam.httpMethod.ping=GET
+eipam.httpMethod.getPool=POST
+eipam.httpMethod.examineIP=POST
+
+# subContext for LGW, if used the above Direct Call subContext need to be commented out
+eipam.subContext.assign=/eipam/restservices/v1/ipaddress/assign
+eipam.subContext.unassign=/eipam/restservices/v1/ipaddress/unassign
+eipam.subContext.createPool=/eipam/restservices/v1/ipaddress/pool
+eipam.subContext.deletePool=/eipam/restservices/v1/ipaddress/pool/remove
+eipam.subContext.getPlanTopology=/eipam/restservices/v1/ipaddress/plantopology
+eipam.subContext.getIPAddress=/eipam/restservices/v1/ipaddress
+eipam.subContext.allocateSubnet=/eipam/restservices/v1/ipaddress/subnet/allocate
+eipam.subContext.deallocateSubnet=/eipam/restservices/v1/ipaddress/subnet/deallocate
+eipam.subContext.activateSubnet=/eipam/restservices/v1/ipaddress/subnet/activate
+eipam.subContext.ping=/eipam/restservices/v1/ipaddress/ping
+eipam.subContext.getPool=/eipam/restservices/v1/ipaddress/pool
+eipam.subContext.examineIP=/eipam/restservices/v1/ipaddress/examineIPAddressInfo
+
+eipam.connectionTimeout=30000
+eipam.receiveTimeout=60000
+#eipam.version=0.1
+#eipam.envContext=TEST
+#eipam.routeOffer=ST3
+eipam.client=sdn_cp_ws
+eipam.msgid=sdn
+eipam.wss.user=sdn_cp_ws
index 9bc78a3..ca0199d 100644 (file)
@@ -151,11 +151,12 @@ logger.audit.level = INFO
 logger.audit.additivity = false
 logger.audit.appenderRef.AuditFile.ref = AuditFile
 
-logger.rr.name = org.onap.logging.filter.base.PayloadLoggingServletFilter
+logger.rr.name = org.onap.ccsdk.apps.filters.PayloadLoggingFilter
 logger.rr.level = INFO
 logger.rr.additivity = false
 logger.rr.appenderRef.RequestResponseFile.ref = RequestResponseFile
 
+
 logger.ccsdk.name = org.onap.ccsdk
 logger.ccsdk.level = DEBUG
 
diff --git a/ms/gra/gra-app/src/main/resources/msoadaptor.properties b/ms/gra/gra-app/src/main/resources/msoadaptor.properties
new file mode 100644 (file)
index 0000000..fb7fac9
--- /dev/null
@@ -0,0 +1,5 @@
+adaptorName=com.att.sdnctl.sli.adaptor.mso.MSOAdaptor
+mso.user=dummy
+mso.passwd=dummy
+mso.restriction.uri=https://msoapih-s3.ecomp.cci.att.com:30275/restriction
+mso.sleep.timer=2000
index 95226f7..8c311fb 100644 (file)
@@ -131,7 +131,7 @@ public class ConfigApiPreloadControllerTest {
         // Clean up data
         configPreloadDataRepository.deleteAll();
 
-        String content = readFileContent("src/test/resources/preload1-net-model-info.json");
+        String content = readFileContent("src/test/resources/preload1-net-list-item.json");
 
         MvcResult mvcResult = mvc.perform(MockMvcRequestBuilders.post(CONFIG_PRELOAD_LIST_URL).contentType(MediaType.APPLICATION_JSON).content(content))
                 .andReturn();
@@ -220,17 +220,11 @@ public class ConfigApiPreloadControllerTest {
         // Clean up data
         configPreloadDataRepository.deleteAll();
 
-        String badContent = readFileContent("src/test/resources/preload1-net-model-info.json");
         String goodContent = readFileContent("src/test/resources/preload1-net-list-item.json");
 
-        // Test with bad file content
-        MvcResult mvcResult = mvc.perform(MockMvcRequestBuilders.put(CONFIG_PRELOAD_LIST_URL+"preload1/network/").contentType(MediaType.APPLICATION_JSON).content(badContent))
-                .andReturn();
-        assertEquals(400, mvcResult.getResponse().getStatus());
-        assertEquals(0, configPreloadDataRepository.count());
 
         // Test with no data
-        mvcResult = mvc.perform(MockMvcRequestBuilders.put(CONFIG_PRELOAD_LIST_URL+"preload1/network/").contentType(MediaType.APPLICATION_JSON).content(goodContent))
+        MvcResult mvcResult = mvc.perform(MockMvcRequestBuilders.put(CONFIG_PRELOAD_LIST_URL+"preload1/network/").contentType(MediaType.APPLICATION_JSON).content(goodContent))
                 .andReturn();
         assertEquals(201, mvcResult.getResponse().getStatus());
         assertEquals(1, configPreloadDataRepository.count());
@@ -318,11 +312,6 @@ public class ConfigApiPreloadControllerTest {
         preloadData.setPreloadData(null);
         configPreloadDataRepository.save(preloadData);
 
-        // Test with bad file content
-        MvcResult mvcResult = mvc.perform(MockMvcRequestBuilders.post(CONFIG_PRELOAD_LIST_URL+"preload1/network/preload-data/").contentType(MediaType.APPLICATION_JSON).content(badContent))
-                .andReturn();
-        assertEquals(400, mvcResult.getResponse().getStatus());
-        assertEquals(1, configPreloadDataRepository.count());
 
     }
 
@@ -399,12 +388,6 @@ public class ConfigApiPreloadControllerTest {
         preloadData.setPreloadData(null);
         configPreloadDataRepository.save(preloadData);
 
-        // Test with bad file content
-        MvcResult mvcResult = mvc.perform(MockMvcRequestBuilders.put(CONFIG_PRELOAD_LIST_URL+"preload1/network/preload-data/").contentType(MediaType.APPLICATION_JSON).content(badContent))
-                .andReturn();
-        assertEquals(400, mvcResult.getResponse().getStatus());
-        assertEquals(1, configPreloadDataRepository.count());
-
     }
 
     @Test
index 603ff20..dd5a6a4 100644 (file)
@@ -182,7 +182,7 @@ public class ConfigApiServicesControllerTest {
         // Clean up data
         clearServicesData();
 
-        String content = readFileContent("src/test/resources/service1.json");
+        String content = readFileContent("src/test/resources/service1-services.json");
 
         // Test with no data
         MvcResult mvcResult = mvc.perform(MockMvcRequestBuilders.post(CONFIG_SERVICES_URL).contentType(MediaType.APPLICATION_JSON).content(content))
@@ -206,7 +206,7 @@ public class ConfigApiServicesControllerTest {
         // Clean up data
         clearServicesData();
 
-        String content = readFileContent("src/test/resources/service1.json");
+        String content = readFileContent("src/test/resources/service1-services.json");
 
         // Test with no data
         MvcResult mvcResult = mvc.perform(MockMvcRequestBuilders.put(CONFIG_SERVICES_URL).contentType(MediaType.APPLICATION_JSON).content(content))
@@ -643,12 +643,12 @@ public class ConfigApiServicesControllerTest {
         clearServicesData();
         assertEquals(0, configServicesRepository.count());
         assertEquals(0, configVnfsRepository.count());
-        MvcResult mvcResult = mvc.perform(MockMvcRequestBuilders.put("/config/GENERIC-RESOURCE-API:services/service/"+TEST_SVC_INSTANCE_ID+"/service-data/vnfs/vnf/"+TEST_VNF_ID+"/").contentType(MediaType.APPLICATION_JSON).content(readFileContent("src/test/resources/vnf-data.json")))
+        MvcResult mvcResult = mvc.perform(MockMvcRequestBuilders.put("/config/GENERIC-RESOURCE-API:services/service/"+TEST_SVC_INSTANCE_ID+"/service-data/vnfs/vnf/"+TEST_VNF_ID+"/").contentType(MediaType.APPLICATION_JSON).content(readFileContent("src/test/resources/vnf.json")))
                                       .andReturn();
         assertEquals(201, mvcResult.getResponse().getStatus());
         assertEquals(1, configVnfsRepository.count());
 
-        mvcResult = mvc.perform(MockMvcRequestBuilders.put("/config/GENERIC-RESOURCE-API:services/service/"+TEST_SVC_INSTANCE_ID+"/service-data/vnfs/vnf/"+TEST_VNF_ID+"/").contentType(MediaType.APPLICATION_JSON).content(readFileContent("src/test/resources/vnf-data.json")))
+        mvcResult = mvc.perform(MockMvcRequestBuilders.put("/config/GENERIC-RESOURCE-API:services/service/"+TEST_SVC_INSTANCE_ID+"/service-data/vnfs/vnf/"+TEST_VNF_ID+"/").contentType(MediaType.APPLICATION_JSON).content(readFileContent("src/test/resources/vnf.json")))
                             .andReturn();
         assertEquals(204, mvcResult.getResponse().getStatus());
         assertEquals(1, configVnfsRepository.count());
index 5c5d827..1079d64 100644 (file)
@@ -503,9 +503,9 @@ Accept: application/json
         "global-customer-id": "{{$guid}}",\r
         "onap-model-information": {\r
           "model-customization-uuid": "12341234",\r
-          "model-invariant-uuid": "12341234",\r
+          "model-invariant-uuid": "b468c6c0-b3c2-462b-8712-1a7b487bc564",\r
           "model-name": "vBNG_0202",\r
-          "model-uuid": "00e50cbd-ef0f-4b28-821e-f2b583752dd3",\r
+          "model-uuid": "fd3d2a5e-0837-4776-abc1-d2bd923000e0",\r
           "model-version": "1920"\r
         },\r
         "service-id": "5c4f2d89-57a3-47e9-b49b-d3c63eb0b3ca",\r
@@ -858,7 +858,8 @@ Accept: application/json
         },\r
         "sdnc-request-header" : {\r
             "svc-request-id" : "svc-{{$guid}}",\r
-            "svc-action" : "assign"\r
+            "svc-action" : "assign",\r
+            "svc-notification-url" : "http://dev.null"\r
         },\r
         "service-information" : {\r
             "onap-model-information": {\r
@@ -1310,6 +1311,15 @@ Accept: application/json
 \r
 { input: {}}\r
 \r
+### vlbcheck\r
+POST {{hostname}}/restconf/operations/SLI-API:vlbcheck/\r
+Authorization: Basic {{token}}\r
+Content-Type: application/json\r
+Accept: application/json\r
+\r
+{ input: {}}\r
+\r
+\r
 ### get preload information (top)\r
 GET {{hostname}}/restconf/config/GENERIC-RESOURCE-API:preload-information/\r
 Authorization: Basic {{token}}\r
index 5aa3371..57b3661 100644 (file)
@@ -1,28 +1,30 @@
 {
-  "allotted-resource-id": "ar2",
-  "allotted-resource-data": {
-    "allotted-resource-oper-status": {
-      "create-timestamp": "2020-11-24T12:41:01.796Z",
-      "order-status": "Active"
-    },
-    "contrail-route-topology": {
-      "contrail-route-assignments": {
-        "contrail-id": "cr2",
-        "dest-network": {
-          "network-id": "19cdfce4-9124-4bbf-83bd-5140931bb519",
-          "network-role": "pktmirror"
+  "contrail-route-allotted-resource": {
+    "allotted-resource-id": "ar2",
+    "allotted-resource-data": {
+      "allotted-resource-oper-status": {
+        "create-timestamp": "2020-11-24T12:41:01.796Z",
+        "order-status": "Active"
+      },
+      "contrail-route-topology": {
+        "contrail-route-assignments": {
+          "contrail-id": "cr2",
+          "dest-network": {
+            "network-id": "19cdfce4-9124-4bbf-83bd-5140931bb519",
+            "network-role": "pktmirror"
+          },
+          "fq-name": "default-domain.GRP-27529-T-IST-13C.GRP-27529-T-SIL-13C_gn_SCTPA_IP_net_12_dyh2b_GRP-27529-T-SIL-13C_gn_SCTPA_IP_pktmirror_policy_32",
+          "source-network": {
+            "network-id": "1610d17a-fb91-48ac-9d4c-43f739fdbe54",
+            "network-role": "GRP-27529-T-SIL-13C_gn_SCTPA_IP"
+          }
         },
-        "fq-name": "default-domain.GRP-27529-T-IST-13C.GRP-27529-T-SIL-13C_gn_SCTPA_IP_net_12_dyh2b_GRP-27529-T-SIL-13C_gn_SCTPA_IP_pktmirror_policy_32",
-        "source-network": {
-          "network-id": "1610d17a-fb91-48ac-9d4c-43f739fdbe54",
-          "network-role": "GRP-27529-T-SIL-13C_gn_SCTPA_IP"
+        "allotted-resource-identifiers": {
+          "allotted-resource-id": "ar2",
+          "allotted-resource-type": "contrail-route",
+          "allotted-resource-name": "GRP-27529-T-SIL-13C_gn_SCTPA_IP_net_12_dyh2b_GRP-27529-T-SIL-13C_gn_SCTPA_IP_pktmirror_policy_32",
+          "parent-service-instance-id": "service1"
         }
-      },
-      "allotted-resource-identifiers": {
-        "allotted-resource-id": "ar2",
-        "allotted-resource-type": "contrail-route",
-        "allotted-resource-name": "GRP-27529-T-SIL-13C_gn_SCTPA_IP_net_12_dyh2b_GRP-27529-T-SIL-13C_gn_SCTPA_IP_pktmirror_policy_32",
-        "parent-service-instance-id": "service1"
       }
     }
   }
diff --git a/ms/gra/gra-app/src/test/resources/contrail-adaptor.properties b/ms/gra/gra-app/src/test/resources/contrail-adaptor.properties
new file mode 100644 (file)
index 0000000..b1b02e6
--- /dev/null
@@ -0,0 +1,37 @@
+keystone.username=admin
+keystone.password=admin
+tenant.password=admin
+contrail.template.dir=/opt/lsc/restapi/templates
+max.retry.count=3
+retry.wait=5000
+request.timeout=10000
+
+simulateResponse=false
+keystone.dummy.cache=true
+orm.dummy.cache=true
+use.orm=true
+
+cloud.config.use=false
+cloud.config.filename=cloud_config.json
+cloud.config.refresh.timer=1000
+
+#orm.default_keystone_url_version=/v3
+orm.default_keystone_url_version=/v2.0
+orm.default_keystone_version_regex=/[vV][0-9]
+orm.default_orm_url_replace_this=8080
+orm.default_orm_url_replace_with_this=7080
+orm.aic.client=ECOMP-SDNCP
+contrail.url.regex=sdn-l-config
+
+#properties need to create json for policymanager configBody
+configBody.service:NetworkPolicy
+configBody.version:1.3.0.1
+configBody.configName:Search
+configBody.policyScope:SDNC
+configBody.templateVersion:1607
+configBody.location:Search
+configBody.uuid:Search
+configBody.priority:2
+configBody.riskType:low
+configBody.riskLevel:2
+configBody.guard:True
diff --git a/ms/gra/gra-app/src/test/resources/contrail-api-path.properties b/ms/gra/gra-app/src/test/resources/contrail-api-path.properties
new file mode 100644 (file)
index 0000000..4c04d0e
--- /dev/null
@@ -0,0 +1,59 @@
+network-policy.create.path=/network-policys
+network-policy.create.method=NetworkPolicy.createNetworkPolicy
+network-policy.create.hasTemplateFile=Y
+
+network-policy.get.path=/network-policy/{contrail-network-policy-id}
+network-policy.get.method=NetworkPolicy.getNetworkPolicy
+network-policy.get.hasTemplateFile=N
+
+network-policy.delete.path=/network-policy/{contrail-network-policy-id}
+network-policy.delete.method=NetworkPolicy.deleteNetworkPolicy
+network-policy.delete.hasTemplateFile=N
+
+network-policy.update.path=/network-policy/{contrail-network-policy-id}
+network-policy.update.method=NetworkPolicy.updateNetworkPolicy
+network-policy.update.hasTemplateFile=Y
+
+network-policy.apply.path=/virtual-network/{contrail-virtual-network-id}
+network-policy.apply.method=NetworkPolicy.applyNetworkPolicy
+network-policy.apply.hasTemplateFile=N
+
+network-policy.remove.path=/virtual-network/{contrail-virtual-network-id}
+network-policy.remove.method=NetworkPolicy.removeNetworkPolicy
+network-policy.remove.hasTemplateFile=N
+
+virtual-networks.get.path=/virtual-networks
+virtual-networks.get.method=NetworkPolicy.getVirtualNetworks
+virtual-networks.get.hasTemplateFile=N
+
+virtual-network.get.path=/virtual-network/{contrail-virtual-network-id}
+virtual-network.get.method=NetworkPolicy.getVirtualNetwork
+virtual-network.get.hasTemplateFile=N
+
+fqname-to-uuid.get.path=/fqname-to-id
+fqname-to-uuid.get.method=NetworkPolicy.getFqNameToUuid
+fqname-to-uuid.get.hasTemplateFile=Y
+
+id-to-fqname.get.path=/id-to-fqname
+id-to-fqname.get.method=NetworkPolicy.getIdToFqName
+id-to-fqname.get.hasTemplateFile=N
+
+virtual-machine-interface.get.path=/virtual-machine-interface/{contrail-virtual-machine-interface-id}
+virtual-machine-interface.get.method=PortMirroring.getVirtualMachineInterface
+virtual-machine-interface.get.hasTemplateFile=N
+
+port-mirroring.enable.path=/virtual-machine-interface/{contrail-virtual-machine-interface-id}
+port-mirroring.enable.method=PortMirroring.enablePortMirroring
+port-mirroring.enable.hasTemplateFile=Y
+
+port-mirroring.disable.path=/virtual-machine-interface/{contrail-virtual-machine-interface-id}
+port-mirroring.disable.method=PortMirroring.disablePortMirroring
+port-mirroring.disable.hasTemplateFile=Y
+
+subnet.add.path=/virtual-network/{contrail-virtual-network-id}
+subnet.add.method=NetworkPolicy.addSubnet
+subnet.add.hasTemplateFile=N
+
+subnet.delete.path=/virtual-network/{contrail-virtual-network-id}
+subnet.delete.method=NetworkPolicy.deleteSubnet
+subnet.delete.hasTemplateFile=N
index ffb2eb3..8d2d0e6 100644 (file)
@@ -55328,4 +55328,73 @@ databaseChangeLog:
             name: vm_count
             valueNumeric: 1
         tableName: VF_MODULE_TO_VFC_MAPPING
+- changeSet:
+    id: 20210620-1
+    author: dtimoney@att.com
+    changes:
+    - modifyDataType:
+        - tableName: CONFIG_GRA_CONTRAIL_ROUTE_ALLOTTED_RESOURCES
+        - columnName: allottedResourceStatusResponseMessage
+        - newDataType: varchar(2000)
+    - modifyDataType:
+        - tableName: CONFIG_GRA_PORT_MIRROR_CONFIGURATIONS
+        - columnName: portMirrorConfigurationStatusResponseMessage
+        - newDataType: varchar(2000)
+    - modifyDataType:
+        - tableName: OPERATIONAL_GRA_CONTRAIL_ROUTE_ALLOTTED_RESOURCES
+        - columnName: allottedResourceStatusResponseMessage
+        - newDataType: varchar(2000)
+    - modifyDataType:
+        - tableName: OPERATIONAL_GRA_PORT_MIRROR_CONFIGURATIONS
+        - columnName: portMirrorConfigurationStatusResponseMessage
+        - newDataType: varchar(2000)
+    - modifyDataType:
+        - tableName: CONFIG_GRA_SERVICES
+        - columnName: serviceStatusResponseMessage
+        - newDataType: varchar(2000)
+    - modifyDataType:
+        - tableName: OPERATIONAL_GRA_SERVICES
+        - columnName: serviceStatusResponseMessage
+        - newDataType: varchar(2000)
 
+- changeSet:
+    id: 210806-1
+    author: dtimoney@att.com
+    preConditions:
+      - onFail: MARK_RAN
+      - tableExists:
+          tableName: PRE_LOAD_VNF_DATA
+    changes:
+    - modifyDataType:
+        - tableName: PRE_LOAD_VNF_DATA
+        - columnName: preload_data 
+        - newDataType: clob
+    - modifyDataType:
+        - tableName: PRE_LOAD_VNF_DATA
+        - columnName: eipam_payload
+        - newDataType: clob
+    - modifyDataType:
+        - tableName: PRE_LOAD_VNF_DATA
+        - columnName: gr_api_data
+        - newDataType: clob
+- changeSet:
+    id: 210806-2
+    author: dtimoney@att.com
+    preConditions:
+      - onFail: MARK_RAN
+      - tableExists:
+          tableName: PRE_LOAD_VNF_NETWORK_DATA
+    changes:
+    - modifyDataType:
+        - tableName: PRE_LOAD_VNF_NETWORK_DATA
+        - columnName: preload_data 
+        - newDataType: clob
+    - modifyDataType:
+        - tableName: PRE_LOAD_VNF_NETWORK_DATA
+        - columnName: eipam_payload
+        - newDataType: clob
+    - modifyDataType:
+        - tableName: PRE_LOAD_VNF_NETWORK_DATA
+        - columnName: gr_api_data
+        - newDataType: clob
+    
\ No newline at end of file
diff --git a/ms/gra/gra-app/src/test/resources/eipam.properties b/ms/gra/gra-app/src/test/resources/eipam.properties
new file mode 100644 (file)
index 0000000..09f2b63
--- /dev/null
@@ -0,0 +1,63 @@
+eipam.templateDir=/opt/lsc/restapi/templates/
+
+#mS is new in 1810, URL is driven by DME2
+eipam.service=microservice-router.lpp.att.com/services/microservice_router/v1/routes
+
+#DME proxy does not work in containers(1908), workaround is to call alternate.url
+# 1906/1908 Can be Direct call or LGW to replace DME2
+#1906 Direct call
+#eipam.alternate.url=https://st3-lppajsc.oss.att.com:8666/services/microservice_router/v1/routes
+#1908 LGW to replace DME2
+#eipam.alternate.url=https://eipam1-ipaddress.dev.att.com
+#eipam.rest.urlEndPoint=/eipam/rest/ipassignment/
+eipam.alternate.url=https://eipam-ipaddress1.stage.att.com
+
+# subContext for Direct Call, if used the LGW subContext below need to be commented out
+#eipam.subContext.assign=/eipamIP/assign
+#eipam.subContext.unassign=/eipamIP/unassign
+#eipam.subContext.createPool=/eipamIP/createPool
+#eipam.subContext.deletePool=/eipamIP/deletePool
+#eipam.subContext.getPlanTopology=/eipamIP/topology
+#eipam.subContext.getIPAddress=/eipamIP/getIP
+#eipam.subContext.allocateSubnet=/eipamIP/allocate
+#eipam.subContext.deallocateSubnet=/eipamIP/deallocate
+#eipam.subContext.activateSubnet=/eipamIP/activateSubnet
+#eipam.subContext.ping=/eipamIP/ping
+#eipam.subContext.getPool=/eipamIP/getPool
+#eipam.subContext.examineIP=/eipamIP/examineIP
+
+eipam.httpMethod.assign=PUT
+eipam.httpMethod.unassign=POST
+eipam.httpMethod.createPool=PUT
+eipam.httpMethod.deletePool=POST
+eipam.httpMethod.getPlanTopology=GET
+eipam.httpMethod.getIPAddress=GET
+eipam.httpMethod.allocateSubnet=PUT
+eipam.httpMethod.deallocateSubnet=PUT
+eipam.httpMethod.activateSubnet=PUT
+eipam.httpMethod.ping=GET
+eipam.httpMethod.getPool=POST
+eipam.httpMethod.examineIP=POST
+
+# subContext for LGW, if used the above Direct Call subContext need to be commented out
+eipam.subContext.assign=/eipam/restservices/v1/ipaddress/assign
+eipam.subContext.unassign=/eipam/restservices/v1/ipaddress/unassign
+eipam.subContext.createPool=/eipam/restservices/v1/ipaddress/pool
+eipam.subContext.deletePool=/eipam/restservices/v1/ipaddress/pool/remove
+eipam.subContext.getPlanTopology=/eipam/restservices/v1/ipaddress/plantopology
+eipam.subContext.getIPAddress=/eipam/restservices/v1/ipaddress
+eipam.subContext.allocateSubnet=/eipam/restservices/v1/ipaddress/subnet/allocate
+eipam.subContext.deallocateSubnet=/eipam/restservices/v1/ipaddress/subnet/deallocate
+eipam.subContext.activateSubnet=/eipam/restservices/v1/ipaddress/subnet/activate
+eipam.subContext.ping=/eipam/restservices/v1/ipaddress/ping
+eipam.subContext.getPool=/eipam/restservices/v1/ipaddress/pool
+eipam.subContext.examineIP=/eipam/restservices/v1/ipaddress/examineIPAddressInfo
+
+eipam.connectionTimeout=30000
+eipam.receiveTimeout=60000
+#eipam.version=0.1
+#eipam.envContext=TEST
+#eipam.routeOffer=ST3
+eipam.client=sdn_cp_ws
+eipam.msgid=sdn
+eipam.wss.user=sdn_cp_ws
diff --git a/ms/gra/gra-app/src/test/resources/msoadaptor.properties b/ms/gra/gra-app/src/test/resources/msoadaptor.properties
new file mode 100644 (file)
index 0000000..fb7fac9
--- /dev/null
@@ -0,0 +1,5 @@
+adaptorName=com.att.sdnctl.sli.adaptor.mso.MSOAdaptor
+mso.user=dummy
+mso.passwd=dummy
+mso.restriction.uri=https://msoapih-s3.ecomp.cci.att.com:30275/restriction
+mso.sleep.timer=2000
index 780d079..8dcc69c 100644 (file)
 {
-  "configuration-data": {
-    "configuration-oper-status": {
-      "last-action": "CreatePortMirrorConfigurationInstance",
-      "last-rpc-action": "activate",
-      "order-status": "Active"
-    },
-    "configuration-operation-information": {
-      "configuration-information": {
-        "configuration-id": "pm-config-2",
-        "configuration-sub-type": "vprobe",
-        "configuration-type": "PORT-MIRROR",
-        "onap-model-information": {
-          "model-customization-uuid": "770c991a-47fb-4225-8d72-4790847f8307",
-          "model-invariant-uuid": "a81abec0-222e-4fb2-b1c6-c4162359b2b3",
-          "model-name": "Port Mirroring Configuration",
-          "model-uuid": "18af239e-5397-4224-816f-d2850f3fab38",
-          "model-version": "23.0"
-        }
+  "port-mirror-configuration": {
+    "configuration-data": {
+      "configuration-oper-status": {
+        "last-action": "CreatePortMirrorConfigurationInstance",
+        "last-rpc-action": "activate",
+        "order-status": "Active"
       },
-      "port-mirror-configuration-request-input": {
-        "dest-port": {
-          "vnf-information": {
-            "vnf-id": "039c2d5d-4efb-4145-9890-a6b5373cdfa5"
+      "configuration-operation-information": {
+        "configuration-information": {
+          "configuration-id": "pm-config-2",
+          "configuration-sub-type": "vprobe",
+          "configuration-type": "PORT-MIRROR",
+          "onap-model-information": {
+            "model-customization-uuid": "770c991a-47fb-4225-8d72-4790847f8307",
+            "model-invariant-uuid": "a81abec0-222e-4fb2-b1c6-c4162359b2b3",
+            "model-name": "Port Mirroring Configuration",
+            "model-uuid": "18af239e-5397-4224-816f-d2850f3fab38",
+            "model-version": "23.0"
           }
         },
-        "source-port": {
-          "vnf-information": {
-            "vnf-id": "c5c92f5d-ed4d-4fb5-9ee1-b3eb562b1c6d"
+        "port-mirror-configuration-request-input": {
+          "dest-port": {
+            "vnf-information": {
+              "vnf-id": "039c2d5d-4efb-4145-9890-a6b5373cdfa5"
+            }
+          },
+          "source-port": {
+            "vnf-information": {
+              "vnf-id": "c5c92f5d-ed4d-4fb5-9ee1-b3eb562b1c6d"
+            }
           }
+        },
+        "request-information": {
+          "request-action": "CreatePortMirrorConfigurationInstance",
+          "request-id": "61fe8925-fb53-4968-b9de-74be4acd06cc",
+          "source": "MSO"
+        },
+        "sdnc-request-header": {
+          "svc-action": "activate",
+          "svc-notification-url": "https://mso-sdnc-s3.ecomp.idns.aic.cip.att.com:30254/adapters/rest/SDNCNotify",
+          "svc-request-id": "ba937e51-6baf-486c-9851-3c6a646c9256"
+        },
+        "service-information": {
+          "global-customer-id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
+          "service-instance-id": "156abc88-35d1-475a-85a1-e0e0a226cbd5",
+          "subscription-service-type": "Mobility"
         }
       },
-      "request-information": {
-        "request-action": "CreatePortMirrorConfigurationInstance",
-        "request-id": "61fe8925-fb53-4968-b9de-74be4acd06cc",
-        "source": "MSO"
-      },
-      "sdnc-request-header": {
-        "svc-action": "activate",
-        "svc-notification-url": "https://mso-sdnc-s3.ecomp.idns.aic.cip.att.com:30254/adapters/rest/SDNCNotify",
-        "svc-request-id": "ba937e51-6baf-486c-9851-3c6a646c9256"
-      },
-      "service-information": {
-        "global-customer-id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
-        "service-instance-id": "156abc88-35d1-475a-85a1-e0e0a226cbd5",
-        "subscription-service-type": "Mobility"
-      }
-    },
-    "port-mirror-configuration-topology": {
-      "configuration-identifiers": {
-        "configuration-id": "pm-config-2",
-        "configuration-name": "vMME02_VLC_Port_Mirroring_DYH2B_SCTPA",
-        "configuration-sub-type": "vprobe",
-        "configuration-type": "PORT-MIRROR",
-        "parent-service-instance-id": "156abc88-35d1-475a-85a1-e0e0a226cbd5"
-      },
-      "port-mirror-configuration-assignments": {
-        "cloud-owner": "att-aic",
-        "cloud-region-id": "dyh2b",
-        "dest-network-fqdn": "default-domain:GRP-27529-T-SIL-13B:GRP-27529-T-SIL-13B_vprobe_int_pkmirror1",
-        "dest-vnf-id": "039c2d5d-4efb-4145-9890-a6b5373cdfa5",
-        "dest-vnfc-instance-group-id": {
+      "port-mirror-configuration-topology": {
+        "configuration-identifiers": {
           "configuration-id": "pm-config-2",
-          "instance-group-role": "pktmirror",
-          "service-instance-id": "156abc88-35d1-475a-85a1-e0e0a226cbd5"
+          "configuration-name": "vMME02_VLC_Port_Mirroring_DYH2B_SCTPA",
+          "configuration-sub-type": "vprobe",
+          "configuration-type": "PORT-MIRROR",
+          "parent-service-instance-id": "156abc88-35d1-475a-85a1-e0e0a226cbd5"
         },
-        "owning-entity": "10c645f5-9924-4b89-bec0-b17cf49d3cad",
-        "probe-type": "vprobe",
-        "route-allotted-resource-id": "286d41ea-d644-46b2-98fc-643ea1b591d1",
-        "source-capacity": 100000,
-        "source-network-fqdn": "default-domain:GRP-27529-T-IST-13C:GRP-27529-T-SIL-13C_gn_SCTPA_IP_net_12",
-        "source-to-dest-maps": {
-          "source-to-dest-map": [
-            {
-              "dest-ip-addresses": {
-                "ip-addresses": {
-                  "ipv4-address": "107.114.102.4"
-                }
+        "port-mirror-configuration-assignments": {
+          "cloud-owner": "att-aic",
+          "cloud-region-id": "dyh2b",
+          "dest-network-fqdn": "default-domain:GRP-27529-T-SIL-13B:GRP-27529-T-SIL-13B_vprobe_int_pkmirror1",
+          "dest-vnf-id": "039c2d5d-4efb-4145-9890-a6b5373cdfa5",
+          "dest-vnfc-instance-group-id": {
+            "configuration-id": "pm-config-2",
+            "instance-group-role": "pktmirror",
+            "service-instance-id": "156abc88-35d1-475a-85a1-e0e0a226cbd5"
+          },
+          "owning-entity": "10c645f5-9924-4b89-bec0-b17cf49d3cad",
+          "probe-type": "vprobe",
+          "route-allotted-resource-id": "286d41ea-d644-46b2-98fc-643ea1b591d1",
+          "source-capacity": 100000,
+          "source-network-fqdn": "default-domain:GRP-27529-T-IST-13C:GRP-27529-T-SIL-13C_gn_SCTPA_IP_net_12",
+          "source-to-dest-maps": {
+            "source-to-dest-map": [
+              {
+                "dest-ip-addresses": {
+                  "ip-addresses": {
+                    "ipv4-address": "107.114.102.4"
+                  }
+                },
+                "dest-port-id": "b91beeda-fae3-4a99-9354-06c965db83f7",
+                "dest-port-name": "zdyh2bprbvlba_module04-vlbagent_eph_aff_0_int_pktmirror_port_0-m5ylyrybbmmb",
+                "dest-vserver-id": "9e2fc5ea-a88f-4955-bda8-10e75c173a8e",
+                "source-port-id": "7b6ee74c-cc2c-4290-95f2-2d89a3c4da74",
+                "source-port-name": "default-virtual-machine-interface-7b6ee74c-cc2c-4290-95f2-2d89a3c4da74",
+                "source-vserver-id": "2e3a8bb2-75ff-4e97-a888-961bfc624caa"
               },
-              "dest-port-id": "b91beeda-fae3-4a99-9354-06c965db83f7",
-              "dest-port-name": "zdyh2bprbvlba_module04-vlbagent_eph_aff_0_int_pktmirror_port_0-m5ylyrybbmmb",
-              "dest-vserver-id": "9e2fc5ea-a88f-4955-bda8-10e75c173a8e",
-              "source-port-id": "7b6ee74c-cc2c-4290-95f2-2d89a3c4da74",
-              "source-port-name": "default-virtual-machine-interface-7b6ee74c-cc2c-4290-95f2-2d89a3c4da74",
-              "source-vserver-id": "2e3a8bb2-75ff-4e97-a888-961bfc624caa"
-            },
-            {
-              "dest-ip-addresses": {
-                "ip-addresses": {
-                  "ipv4-address": "107.114.102.3"
-                }
-              },
-              "dest-port-id": "7cf3fda3-3153-4655-ae47-36fcf4439073",
-              "dest-port-name": "zdyh2bprbvlba_base_5-vlbagentbase_eph_aff_0_int_pktmirror_port_0-vkvey3eyoqk2",
-              "dest-vserver-id": "165db140-c09f-411a-bfdc-b8e6c7dbbda4",
-              "source-port-id": "0fd4c63c-6fda-4564-af10-d3be157279ef",
-              "source-port-name": "default-virtual-machine-interface-0fd4c63c-6fda-4564-af10-d3be157279ef",
-              "source-vserver-id": "b5bf2e1f-9f90-445c-be00-2c882e82d1d7"
-            }
-          ]
-        },
-        "source-vnf-id": "c5c92f5d-ed4d-4fb5-9ee1-b3eb562b1c6d",
-        "source-vnfc-instance-group-id": {
-          "configuration-id": "pm-config-2",
-          "instance-group-role": "GRP-27529-T-SIL-13C_gn_SCTPA_IP",
-          "service-instance-id": "156abc88-35d1-475a-85a1-e0e0a226cbd5"
-        },
-        "tenant": "GRP-27529-T-IST-13C",
-        "tenant-context": "Test",
-        "tenant-id": "077445458306425499337c98bafc8c47",
-        "vnics-group-id": "97"
+              {
+                "dest-ip-addresses": {
+                  "ip-addresses": {
+                    "ipv4-address": "107.114.102.3"
+                  }
+                },
+                "dest-port-id": "7cf3fda3-3153-4655-ae47-36fcf4439073",
+                "dest-port-name": "zdyh2bprbvlba_base_5-vlbagentbase_eph_aff_0_int_pktmirror_port_0-vkvey3eyoqk2",
+                "dest-vserver-id": "165db140-c09f-411a-bfdc-b8e6c7dbbda4",
+                "source-port-id": "0fd4c63c-6fda-4564-af10-d3be157279ef",
+                "source-port-name": "default-virtual-machine-interface-0fd4c63c-6fda-4564-af10-d3be157279ef",
+                "source-vserver-id": "b5bf2e1f-9f90-445c-be00-2c882e82d1d7"
+              }
+            ]
+          },
+          "source-vnf-id": "c5c92f5d-ed4d-4fb5-9ee1-b3eb562b1c6d",
+          "source-vnfc-instance-group-id": {
+            "configuration-id": "pm-config-2",
+            "instance-group-role": "GRP-27529-T-SIL-13C_gn_SCTPA_IP",
+            "service-instance-id": "156abc88-35d1-475a-85a1-e0e0a226cbd5"
+          },
+          "tenant": "GRP-27529-T-IST-13C",
+          "tenant-context": "Test",
+          "tenant-id": "077445458306425499337c98bafc8c47",
+          "vnics-group-id": "97"
+        }
       }
-    }
-  },
-  "configuration-id": "pm-config-2"
+    },
+    "configuration-id": "pm-config-2"
+  }
 }
\ No newline at end of file
index 4a91388..29c6da0 100644 (file)
@@ -1,81 +1,82 @@
 {
-  "preload-id": "preload1",
-  "preload-type": "network",
-  "preload-data": {
-    "preload-network-topology-information": {
-      "host-routes": [
-        {
-          "next-hop": "10.1.12.1",
-          "route-prefix": "12"
-        }
-      ],
-      "is-external-network": false,
-      "is-provider-network": false,
-      "is-shared-network": false,
-      "network-policy": [
-        {
-          "network-policy-fqdn": "policy-sdnc.onap.org",
-          "network-policy-id": "123"
-        }
-      ],
-      "network-topology-identifier-structure": {
-        "eipam-v4-address-plan": "plan9",
-        "eipam-v6-address-plan": "plan9v6",
-        "is-trunked": true,
-        "network-id": "preload1",
-        "network-instance-group-id": "abc123",
-        "network-name": "syfy",
-        "network-role": "secret",
-        "network-technology": "soupcan",
-        "network-type": "fake",
-        "related-networks": {
-          "related-network": [
-            {
-              "network-id": "skynet",
-              "network-role": "master",
-              "vlan-tags": {
-                "is-private": true,
-                "lower-tag-id": 0,
-                "upper-tag-id": 0,
-                "vlan-interface": "le0"
+  "preload-list": {
+    "preload-id": "preload1",
+    "preload-type": "network",
+    "preload-data": {
+      "preload-network-topology-information": {
+        "host-routes": [
+          {
+            "next-hop": "10.1.12.1",
+            "route-prefix": "12"
+          }
+        ],
+        "is-external-network": false,
+        "is-provider-network": false,
+        "is-shared-network": false,
+        "network-policy": [
+          {
+            "network-policy-fqdn": "policy-sdnc.onap.org",
+            "network-policy-id": "123"
+          }
+        ],
+        "network-topology-identifier-structure": {
+          "eipam-v4-address-plan": "plan9",
+          "eipam-v6-address-plan": "plan9v6",
+          "is-trunked": true,
+          "network-id": "preload1",
+          "network-instance-group-id": "abc123",
+          "network-name": "syfy",
+          "network-role": "secret",
+          "network-technology": "soupcan",
+          "network-type": "fake",
+          "related-networks": {
+            "related-network": [
+              {
+                "network-id": "skynet",
+                "network-role": "master",
+                "vlan-tags": {
+                  "is-private": true,
+                  "lower-tag-id": 0,
+                  "upper-tag-id": 0,
+                  "vlan-interface": "le0"
+                }
               }
-            }
-          ]
+            ]
+          },
+          "segmentation-id": "seg1"
         },
-        "segmentation-id": "seg1"
-      },
-      "physical-network-name": "skynet",
-      "route-table-reference": [
-        {
-          "route-table-reference-fqdn": "sky.net",
-          "route-table-reference-id": "ref1"
-        }
-      ],
-      "subnets": [
-        {
-          "addr-from-start": "Y",
-          "cidr-mask": "255.255.0.0",
-          "dhcp-enabled": "Y",
-          "dhcp-end-address": "10.1.2.254",
-          "dhcp-start-address": "10.1.2.1",
-          "gateway-address": "10.1.2.255",
-          "ip-version": "ipv4",
-          "start-address": "10.1.2.1",
-          "subnet-name": "subnet1",
-          "subnet-role": "puppies",
-          "subnet-sequence": 0
-        }
-      ],
-      "vpn-bindings": [
-        {
-          "aic-zone": "zone1",
-          "global-route-target": "string",
-          "route-target-role": "string",
-          "vpn-binding-id": "string",
-          "vpn-name": "string"
-        }
-      ]
+        "physical-network-name": "skynet",
+        "route-table-reference": [
+          {
+            "route-table-reference-fqdn": "sky.net",
+            "route-table-reference-id": "ref1"
+          }
+        ],
+        "subnets": [
+          {
+            "addr-from-start": "Y",
+            "cidr-mask": "255.255.0.0",
+            "dhcp-enabled": "Y",
+            "dhcp-end-address": "10.1.2.254",
+            "dhcp-start-address": "10.1.2.1",
+            "gateway-address": "10.1.2.255",
+            "ip-version": "ipv4",
+            "start-address": "10.1.2.1",
+            "subnet-name": "subnet1",
+            "subnet-role": "puppies",
+            "subnet-sequence": 0
+          }
+        ],
+        "vpn-bindings": [
+          {
+            "aic-zone": "zone1",
+            "global-route-target": "string",
+            "route-target-role": "string",
+            "vpn-binding-id": "string",
+            "vpn-name": "string"
+          }
+        ]
+      }
     }
   }
-}
-
+}
\ No newline at end of file
index 586915a..80dbc1c 100644 (file)
@@ -1,84 +1,86 @@
 {
-    "preload-list": [
-        {
-            "preload-id": "preload1",
-            "preload-type": "network",
-            "preload-data": {
-                "preload-network-topology-information": {
-                    "host-routes": [
-                        {
-                            "next-hop": "10.1.12.1",
-                            "route-prefix": "12"
-                        }
-                    ],
-                    "is-external-network": true,
-                    "is-provider-network": true,
-                    "is-shared-network": true,
-                    "network-policy": [
-                        {
-                            "network-policy-fqdn": "policy-sdnc.onap.org",
-                            "network-policy-id": "123"
-                        }
-                    ],
-                    "network-topology-identifier-structure": {
-                        "eipam-v4-address-plan": "plan9",
-                        "eipam-v6-address-plan": "plan9v6",
-                        "is-trunked": true,
-                        "network-id": "preload1",
-                        "network-instance-group-id": "abc123",
-                        "network-name": "syfy",
-                        "network-role": "secret",
-                        "network-technology": "soupcan",
-                        "network-type": "fake",
-                        "related-networks": {
-                            "related-network": [
-                                {
-                                    "network-id": "skynet",
-                                    "network-role": "master",
-                                    "vlan-tags": {
-                                        "is-private": true,
-                                        "lower-tag-id": 0,
-                                        "upper-tag-id": 0,
-                                        "vlan-interface": "le0"
+    "preload-information": {
+        "preload-list": [
+            {
+                "preload-id": "preload1",
+                "preload-type": "network",
+                "preload-data": {
+                    "preload-network-topology-information": {
+                        "host-routes": [
+                            {
+                                "next-hop": "10.1.12.1",
+                                "route-prefix": "12"
+                            }
+                        ],
+                        "is-external-network": true,
+                        "is-provider-network": true,
+                        "is-shared-network": true,
+                        "network-policy": [
+                            {
+                                "network-policy-fqdn": "policy-sdnc.onap.org",
+                                "network-policy-id": "123"
+                            }
+                        ],
+                        "network-topology-identifier-structure": {
+                            "eipam-v4-address-plan": "plan9",
+                            "eipam-v6-address-plan": "plan9v6",
+                            "is-trunked": true,
+                            "network-id": "preload1",
+                            "network-instance-group-id": "abc123",
+                            "network-name": "syfy",
+                            "network-role": "secret",
+                            "network-technology": "soupcan",
+                            "network-type": "fake",
+                            "related-networks": {
+                                "related-network": [
+                                    {
+                                        "network-id": "skynet",
+                                        "network-role": "master",
+                                        "vlan-tags": {
+                                            "is-private": true,
+                                            "lower-tag-id": 0,
+                                            "upper-tag-id": 0,
+                                            "vlan-interface": "le0"
+                                        }
                                     }
-                                }
-                            ]
+                                ]
+                            },
+                            "segmentation-id": "seg1"
                         },
-                        "segmentation-id": "seg1"
-                    },
-                    "physical-network-name": "skynet",
-                    "route-table-reference": [
-                        {
-                            "route-table-reference-fqdn": "sky.net",
-                            "route-table-reference-id": "ref1"
-                        }
-                    ],
-                    "subnets": [
-                        {
-                            "addr-from-start": "Y",
-                            "cidr-mask": "255.255.0.0",
-                            "dhcp-enabled": "Y",
-                            "dhcp-end-address": "10.1.2.254",
-                            "dhcp-start-address": "10.1.2.1",
-                            "gateway-address": "10.1.2.255",
-                            "ip-version": "ipv4",
-                            "start-address": "10.1.2.1",
-                            "subnet-name": "subnet1",
-                            "subnet-role": "puppies",
-                            "subnet-sequence": 0
-                        }
-                    ],
-                    "vpn-bindings": [
-                        {
-                            "aic-zone": "zone1",
-                            "global-route-target": "string",
-                            "route-target-role": "string",
-                            "vpn-binding-id": "string",
-                            "vpn-name": "string"
-                        }
-                    ]
+                        "physical-network-name": "skynet",
+                        "route-table-reference": [
+                            {
+                                "route-table-reference-fqdn": "sky.net",
+                                "route-table-reference-id": "ref1"
+                            }
+                        ],
+                        "subnets": [
+                            {
+                                "addr-from-start": "Y",
+                                "cidr-mask": "255.255.0.0",
+                                "dhcp-enabled": "Y",
+                                "dhcp-end-address": "10.1.2.254",
+                                "dhcp-start-address": "10.1.2.1",
+                                "gateway-address": "10.1.2.255",
+                                "ip-version": "ipv4",
+                                "start-address": "10.1.2.1",
+                                "subnet-name": "subnet1",
+                                "subnet-role": "puppies",
+                                "subnet-sequence": 0
+                            }
+                        ],
+                        "vpn-bindings": [
+                            {
+                                "aic-zone": "zone1",
+                                "global-route-target": "string",
+                                "route-target-role": "string",
+                                "vpn-binding-id": "string",
+                                "vpn-name": "string"
+                            }
+                        ]
+                    }
                 }
             }
-        }
-    ]
-}
+        ]
+    }
+}
\ No newline at end of file
index 74da3de..ed9f326 100644 (file)
@@ -1,5 +1,5 @@
 {
-
+  "preload-data": {
     "preload-network-topology-information": {
       "host-routes": [
         {
@@ -74,5 +74,5 @@
         }
       ]
     }
-}
-
+  }
+}
\ No newline at end of file
index abf7da2..3f289cf 100644 (file)
@@ -1,69 +1,67 @@
 {
-    "service": [
-        {
-            "service-instance-id": "5c4f2d89-57a3-47e9-b49b-d3c63eb0b3ca",
-            "service-data": {
-                "request-information": {
-                    "notification-url": "http://dev.null",
-                    "request-id": "req123",
-                    "order-number": "123",
-                    "request-action": "CreateServiceInstance",
-                    "order-version": "version1",
-                    "source": "curl"
-                },
-                "service-request-input": {
-                    "service-instance-name": "zrdm61asmsf01_svc"
+    "service": [{
+        "service-instance-id": "5c4f2d89-57a3-47e9-b49b-d3c63eb0b3ca",
+        "service-data": {
+            "request-information": {
+                "notification-url": "http://dev.null",
+                "request-id": "req123",
+                "order-number": "123",
+                "request-action": "CreateServiceInstance",
+                "order-version": "version1",
+                "source": "curl"
+            },
+            "service-request-input": {
+                "service-instance-name": "zrdm61asmsf01_svc"
+            },
+            "service-information": {
+                "service-id": "5c4f2d89-57a3-47e9-b49b-d3c63eb0b3ca",
+                "onap-model-information": {
+                    "model-invariant-uuid": "12341234",
+                    "model-name": "vBNG_0202",
+                    "model-version": "1920",
+                    "model-customization-uuid": "12341234",
+                    "model-uuid": "00e50cbd-ef0f-4b28-821e-f2b583752dd3"
                 },
-                "service-information": {
-                    "service-id": "5c4f2d89-57a3-47e9-b49b-d3c63eb0b3ca",
-                    "onap-model-information": {
-                        "model-invariant-uuid": "12341234",
-                        "model-name": "vBNG_0202",
-                        "model-version": "1920",
-                        "model-customization-uuid": "12341234",
-                        "model-uuid": "00e50cbd-ef0f-4b28-821e-f2b583752dd3"
-                    },
-                    "global-customer-id": "cust123",
-                    "subscription-service-type": "test",
+                "global-customer-id": "cust123",
+                "subscription-service-type": "test",
+                "service-instance-id": "5c4f2d89-57a3-47e9-b49b-d3c63eb0b3ca",
+                "subscriber-name": "test"
+            },
+            "service-topology": {
+                "service-topology-identifier": {
                     "service-instance-id": "5c4f2d89-57a3-47e9-b49b-d3c63eb0b3ca",
-                    "subscriber-name": "test"
+                    "service-instance-name": "zrdm61asmsf01_svc",
+                    "service-type": "test",
+                    "global-customer-id": "cust123"
                 },
-                "service-topology": {
-                    "service-topology-identifier": {
-                        "service-instance-id": "5c4f2d89-57a3-47e9-b49b-d3c63eb0b3ca",
-                        "service-instance-name": "zrdm61asmsf01_svc",
-                        "service-type": "test",
-                        "global-customer-id": "cust123"
-                    },
-                    "onap-model-information": {
-                        "model-invariant-uuid": "12341234",
-                        "model-name": "vBNG_0202",
-                        "model-version": "1920",
-                        "model-customization-uuid": "12341234",
-                        "model-uuid": "00e50cbd-ef0f-4b28-821e-f2b583752dd3"
-                    }
-                },
-                "service-level-oper-status": {
-                    "order-status": "Created",
-                    "last-rpc-action": "assign",
-                    "last-action": "CreateServiceInstance"
-                },
-                "sdnc-request-header": {
-                    "svc-action": "assign",
-                    "svc-notification-url": "http://dev.null",
-                    "svc-request-id": "svcreq123"
+                "onap-model-information": {
+                    "model-invariant-uuid": "12341234",
+                    "model-name": "vBNG_0202",
+                    "model-version": "1920",
+                    "model-customization-uuid": "12341234",
+                    "model-uuid": "00e50cbd-ef0f-4b28-821e-f2b583752dd3"
                 }
             },
-            "service-status": {
-                "final-indicator": "Y",
-                "rpc-action": "assign",
-                "rpc-name": "service-topology-operation",
-                "response-code": "200",
-                "response-timestamp": "2020-08-17T12:29:24.031Z",
-                "response-message": "",
-                "action": "CreateServiceInstance",
-                "request-status": "synccomplete"
+            "service-level-oper-status": {
+                "order-status": "Created",
+                "last-rpc-action": "assign",
+                "last-action": "CreateServiceInstance"
+            },
+            "sdnc-request-header": {
+                "svc-action": "assign",
+                "svc-notification-url": "http://dev.null",
+                "svc-request-id": "svcreq123"
             }
+        },
+        "service-status": {
+            "final-indicator": "Y",
+            "rpc-action": "assign",
+            "rpc-name": "service-topology-operation",
+            "response-code": "200",
+            "response-timestamp": "2020-08-17T12:29:24.031Z",
+            "response-message": "",
+            "action": "CreateServiceInstance",
+            "request-status": "synccomplete"
         }
-    ]
-}
+    }]
+}
\ No newline at end of file
index 8521b76..cd97888 100644 (file)
 {
-  "request-information": {
-    "request-id": "f5554477-51c7-4f8e-9183-f8968f3f86bf",
-    "request-action": "CreateServiceInstance",
-    "source": "MSO"
-  },
-  "service-request-input": {
-    "service-instance-name": "zrdm61asmsf01_svc"
-  },
-  "service-information": {
-    "service-id": "5c4f2d89-57a3-47e9-b49b-d3c63eb0b3ca",
-    "onap-model-information": {
-      "model-name": "service-nginx-ingress-1",
-      "model-invariant-uuid": "0fe6193d-2d65-4b8e-a4ee-a07821566b5e",
-      "model-version": "1.0",
-      "model-uuid": "48223a6a-f5e1-4354-95eb-f5ea014fc9df"
+  "service-data": {
+    "request-information": {
+      "request-id": "f5554477-51c7-4f8e-9183-f8968f3f86bf",
+      "request-action": "CreateServiceInstance",
+      "source": "MSO"
     },
-    "service-instance-id": "5c4f2d89-57a3-47e9-b49b-d3c63eb0b3ca",
-    "global-customer-id": "cust123",
-    "subscription-service-type": "test"
-  },
-  "service-topology": {
-    "service-topology-identifier": {
+    "service-request-input": {
+      "service-instance-name": "zrdm61asmsf01_svc"
+    },
+    "service-information": {
+      "service-id": "5c4f2d89-57a3-47e9-b49b-d3c63eb0b3ca",
+      "onap-model-information": {
+        "model-name": "service-nginx-ingress-1",
+        "model-invariant-uuid": "0fe6193d-2d65-4b8e-a4ee-a07821566b5e",
+        "model-version": "1.0",
+        "model-uuid": "48223a6a-f5e1-4354-95eb-f5ea014fc9df"
+      },
       "service-instance-id": "5c4f2d89-57a3-47e9-b49b-d3c63eb0b3ca",
-      "service-instance-name": "zrdm61asmsf01_svc",
-      "service-type": "service-nginx-ingress-1",
-      "global-customer-id": "Demonstration"
+      "global-customer-id": "cust123",
+      "subscription-service-type": "test"
     },
-    "onap-model-information": {
-      "model-name": "service-nginx-ingress-1",
-      "model-invariant-uuid": "0fe6193d-2d65-4b8e-a4ee-a07821566b5e",
-      "model-version": "1.0",
-      "model-uuid": "48223a6a-f5e1-4354-95eb-f5ea014fc9df"
-    }
-  },
-  "service-level-oper-status": {
-    "order-status": "Created",
-    "last-rpc-action": "assign",
-    "last-action": "CreateServiceInstance"
-  },
-  "sdnc-request-header": {
-    "svc-action": "assign",
-    "svc-request-id": "6d06a832-69da-4369-9d99-049767a39400"
-  },
-  "vnfs": {
-    "vnf": [
-      {
-        "vnf-id": "fae319cc-68d6-496f-be1e-a09e133c71d4",
-        "vnf-data": {
-          "vnf-level-oper-status": {
-            "order-status": "Created",
-            "last-rpc-action": "activate",
-            "last-action": "CreateVnfInstance"
-          },
-          "service-information": {
-            "service-id": "service1",
-            "onap-model-information": {
-              "model-name": "service-nginx-ingress-1",
-              "model-invariant-uuid": "0fe6193d-2d65-4b8e-a4ee-a07821566b5e",
-              "model-version": "1.0",
-              "model-uuid": "48223a6a-f5e1-4354-95eb-f5ea014fc9df"
+    "service-topology": {
+      "service-topology-identifier": {
+        "service-instance-id": "5c4f2d89-57a3-47e9-b49b-d3c63eb0b3ca",
+        "service-instance-name": "zrdm61asmsf01_svc",
+        "service-type": "service-nginx-ingress-1",
+        "global-customer-id": "Demonstration"
+      },
+      "onap-model-information": {
+        "model-name": "service-nginx-ingress-1",
+        "model-invariant-uuid": "0fe6193d-2d65-4b8e-a4ee-a07821566b5e",
+        "model-version": "1.0",
+        "model-uuid": "48223a6a-f5e1-4354-95eb-f5ea014fc9df"
+      }
+    },
+    "service-level-oper-status": {
+      "order-status": "Created",
+      "last-rpc-action": "assign",
+      "last-action": "CreateServiceInstance"
+    },
+    "sdnc-request-header": {
+      "svc-action": "assign",
+      "svc-request-id": "6d06a832-69da-4369-9d99-049767a39400"
+    },
+    "vnfs": {
+      "vnf": [
+        {
+          "vnf-id": "fae319cc-68d6-496f-be1e-a09e133c71d4",
+          "vnf-data": {
+            "vnf-level-oper-status": {
+              "order-status": "Created",
+              "last-rpc-action": "activate",
+              "last-action": "CreateVnfInstance"
             },
-            "service-instance-id": "5c4f2d89-57a3-47e9-b49b-d3c63eb0b3ca",
-            "global-customer-id": "cust123",
-            "subscription-service-type": "service-nginx-ingress-1"
-          },
-          "sdnc-request-header": {
-            "svc-action": "activate",
-            "svc-request-id": "acf0c0db-106f-42e4-b77b-191e9d229eb9",
-            "svc-notification-url": "http://so-bpmn-infra.onap:8081/mso/WorkflowMessage/SDNCCallback/b8f92243-85cb-4954-970d-7e0159b9a48b"
-          },
-          "vnf-information": {
-            "vnf-id": "fae319cc-68d6-496f-be1e-a09e133c71d4",
-            "onap-model-information": {
-              "model-name": "nginx-ingress-1",
-              "model-invariant-uuid": "ebd1565b-a98f-4d77-9b91-6aefd51d040c",
-              "model-version": "1.0",
-              "model-customization-uuid": "69cff101-d1f2-4bf3-9697-57f52ba3c5dd",
-              "model-uuid": "dfeccc32-2459-43bf-bfdd-36567e696090"
+            "service-information": {
+              "service-id": "service1",
+              "onap-model-information": {
+                "model-name": "service-nginx-ingress-1",
+                "model-invariant-uuid": "0fe6193d-2d65-4b8e-a4ee-a07821566b5e",
+                "model-version": "1.0",
+                "model-uuid": "48223a6a-f5e1-4354-95eb-f5ea014fc9df"
+              },
+              "service-instance-id": "5c4f2d89-57a3-47e9-b49b-d3c63eb0b3ca",
+              "global-customer-id": "cust123",
+              "subscription-service-type": "service-nginx-ingress-1"
             },
-            "vnf-type": "service-nginx-ingress-1/nginx-ingress-1 0",
-            "vnf-name": "Python_ONAP_SDK_vnf_instance_2aff902a-4714-4d08-942d-d97b3a3b87c2"
-          },
-          "request-information": {
-            "request-id": "c382d6d1-2108-4c39-ab7a-c3e67cdbc749",
-            "request-action": "CreateVnfInstance",
-            "source": "MSO"
-          },
-          "vnf-request-input": {
-            "vnf-name": "Python_ONAP_SDK_vnf_instance_2aff902a-4714-4d08-942d-d97b3a3b87c2",
-            "tenant": "k8s_tenant_1",
-            "cloud-owner": "k8sCloudOwner",
-            "aic-cloud-region": "k8s_region_1"
-          },
-          "vnf-topology": {
-            "onap-model-information": {
-              "model-name": "nginx-ingress-1",
-              "model-invariant-uuid": "ebd1565b-a98f-4d77-9b91-6aefd51d040c",
-              "model-version": "1.0",
-              "model-customization-uuid": "69cff101-d1f2-4bf3-9697-57f52ba3c5dd",
-              "model-uuid": "dfeccc32-2459-43bf-bfdd-36567e696090"
+            "sdnc-request-header": {
+              "svc-action": "activate",
+              "svc-request-id": "acf0c0db-106f-42e4-b77b-191e9d229eb9",
+              "svc-notification-url": "http://so-bpmn-infra.onap:8081/mso/WorkflowMessage/SDNCCallback/b8f92243-85cb-4954-970d-7e0159b9a48b"
             },
-            "tenant": "k8s_tenant_1",
-            "aic-clli": "complexMC",
-            "aic-cloud-region": "k8s_region_1",
-            "vnf-topology-identifier-structure": {
+            "vnf-information": {
               "vnf-id": "fae319cc-68d6-496f-be1e-a09e133c71d4",
+              "onap-model-information": {
+                "model-name": "nginx-ingress-1",
+                "model-invariant-uuid": "ebd1565b-a98f-4d77-9b91-6aefd51d040c",
+                "model-version": "1.0",
+                "model-customization-uuid": "69cff101-d1f2-4bf3-9697-57f52ba3c5dd",
+                "model-uuid": "dfeccc32-2459-43bf-bfdd-36567e696090"
+              },
               "vnf-type": "service-nginx-ingress-1/nginx-ingress-1 0",
               "vnf-name": "Python_ONAP_SDK_vnf_instance_2aff902a-4714-4d08-942d-d97b3a3b87c2"
             },
-            "vnf-resource-assignments": {
-              "availability-zones": {
-                "availability-zone": [
-                  "k8s_availability_zone_1"
-                ]
+            "request-information": {
+              "request-id": "c382d6d1-2108-4c39-ab7a-c3e67cdbc749",
+              "request-action": "CreateVnfInstance",
+              "source": "MSO"
+            },
+            "vnf-request-input": {
+              "vnf-name": "Python_ONAP_SDK_vnf_instance_2aff902a-4714-4d08-942d-d97b3a3b87c2",
+              "tenant": "k8s_tenant_1",
+              "cloud-owner": "k8sCloudOwner",
+              "aic-cloud-region": "k8s_region_1"
+            },
+            "vnf-topology": {
+              "onap-model-information": {
+                "model-name": "nginx-ingress-1",
+                "model-invariant-uuid": "ebd1565b-a98f-4d77-9b91-6aefd51d040c",
+                "model-version": "1.0",
+                "model-customization-uuid": "69cff101-d1f2-4bf3-9697-57f52ba3c5dd",
+                "model-uuid": "dfeccc32-2459-43bf-bfdd-36567e696090"
+              },
+              "tenant": "k8s_tenant_1",
+              "aic-clli": "complexMC",
+              "aic-cloud-region": "k8s_region_1",
+              "vnf-topology-identifier-structure": {
+                "vnf-id": "fae319cc-68d6-496f-be1e-a09e133c71d4",
+                "vnf-type": "service-nginx-ingress-1/nginx-ingress-1 0",
+                "vnf-name": "Python_ONAP_SDK_vnf_instance_2aff902a-4714-4d08-942d-d97b3a3b87c2"
+              },
+              "vnf-resource-assignments": {
+                "availability-zones": {
+                  "availability-zone": [
+                    "k8s_availability_zone_1"
+                  ]
+                }
               }
-            }
-          },
-          "vf-modules": {
-            "vf-module": [
-              {
-                "vf-module-id": "269bda16-f40c-41a9-baef-e8905ab2b70e",
-                "vf-module-data": {
-                  "service-information": {
-                    "service-id": "5c4f2d89-57a3-47e9-b49b-d3c63eb0b3ca",
-                    "onap-model-information": {
-                      "model-name": "service-nginx-ingress-1",
-                      "model-invariant-uuid": "0fe6193d-2d65-4b8e-a4ee-a07821566b5e",
-                      "model-version": "1.0",
-                      "model-uuid": "48223a6a-f5e1-4354-95eb-f5ea014fc9df"
+            },
+            "vf-modules": {
+              "vf-module": [
+                {
+                  "vf-module-id": "269bda16-f40c-41a9-baef-e8905ab2b70e",
+                  "vf-module-data": {
+                    "service-information": {
+                      "service-id": "5c4f2d89-57a3-47e9-b49b-d3c63eb0b3ca",
+                      "onap-model-information": {
+                        "model-name": "service-nginx-ingress-1",
+                        "model-invariant-uuid": "0fe6193d-2d65-4b8e-a4ee-a07821566b5e",
+                        "model-version": "1.0",
+                        "model-uuid": "48223a6a-f5e1-4354-95eb-f5ea014fc9df"
+                      },
+                      "service-instance-id": "5c4f2d89-57a3-47e9-b49b-d3c63eb0b3ca",
+                      "global-customer-id": "cust123",
+                      "subscription-service-type": "test"
                     },
-                    "service-instance-id": "5c4f2d89-57a3-47e9-b49b-d3c63eb0b3ca",
-                    "global-customer-id": "cust123",
-                    "subscription-service-type": "test"
-                  },
-                  "vf-module-topology": {
-                    "onap-model-information": {
-                      "model-name": "NginxIngress1..nginx-ingress..module-0",
-                      "model-invariant-uuid": "caa22b8e-e0de-4d2c-9048-9a71d39afd91",
-                      "model-version": "1",
-                      "model-customization-uuid": "d6403fe2-ebe4-4fce-bec2-0218f61b2564",
-                      "model-uuid": "e5d2fe74-9534-4a7c-9a1b-f49ecf1105e3"
+                    "vf-module-topology": {
+                      "onap-model-information": {
+                        "model-name": "NginxIngress1..nginx-ingress..module-0",
+                        "model-invariant-uuid": "caa22b8e-e0de-4d2c-9048-9a71d39afd91",
+                        "model-version": "1",
+                        "model-customization-uuid": "d6403fe2-ebe4-4fce-bec2-0218f61b2564",
+                        "model-uuid": "e5d2fe74-9534-4a7c-9a1b-f49ecf1105e3"
+                      },
+                      "vf-module-parameters": {
+                        "param": [
+                          {
+                            "name": "availability_zone_0",
+                            "value": "k8s_availability_zone_1"
+                          },
+                          {
+                            "name": "k8s-rb-profile-name",
+                            "value": "default"
+                          }
+                        ]
+                      },
+                      "tenant": "k8s_tenant_1",
+                      "sdnc-generated-cloud-resources": true,
+                      "aic-clli": "complexMC",
+                      "vf-module-topology-identifier": {
+                        "vf-module-type": "NginxIngress1..nginx-ingress..module-0",
+                        "vf-module-id": "269bda16-f40c-41a9-baef-e8905ab2b70e",
+                        "vf-module-name": "Python_ONAP_SDK_vf_module_instance_678cc889-0c89-40f3-9f5b-1f475d5c4ebb"
+                      },
+                      "aic-cloud-region": "k8s_region_1"
                     },
-                    "vf-module-parameters": {
-                      "param": [
-                        {
-                          "name": "availability_zone_0",
-                          "value": "k8s_availability_zone_1"
-                        },
-                        {
-                          "name": "k8s-rb-profile-name",
-                          "value": "default"
-                        }
-                      ]
+                    "vf-module-request-input": {
+                      "vf-module-name": "Python_ONAP_SDK_vf_module_instance_678cc889-0c89-40f3-9f5b-1f475d5c4ebb",
+                      "tenant": "k8s_tenant_1",
+                      "cloud-owner": "k8sCloudOwner",
+                      "aic-cloud-region": "k8s_region_1"
                     },
-                    "tenant": "k8s_tenant_1",
-                    "sdnc-generated-cloud-resources": true,
-                    "aic-clli": "complexMC",
-                    "vf-module-topology-identifier": {
-                      "vf-module-type": "NginxIngress1..nginx-ingress..module-0",
-                      "vf-module-id": "269bda16-f40c-41a9-baef-e8905ab2b70e",
-                      "vf-module-name": "Python_ONAP_SDK_vf_module_instance_678cc889-0c89-40f3-9f5b-1f475d5c4ebb"
+                    "sdnc-request-header": {
+                      "svc-action": "activate",
+                      "svc-request-id": "bf81d48a-d5f9-42f2-bc49-9277f0e2a836",
+                      "svc-notification-url": "http://so-bpmn-infra.onap:8081/mso/WorkflowMessage/SDNCCallback/64780567-ecf5-41c9-af36-bb06f8ae0e5d"
                     },
-                    "aic-cloud-region": "k8s_region_1"
-                  },
-                  "vf-module-request-input": {
-                    "vf-module-name": "Python_ONAP_SDK_vf_module_instance_678cc889-0c89-40f3-9f5b-1f475d5c4ebb",
-                    "tenant": "k8s_tenant_1",
-                    "cloud-owner": "k8sCloudOwner",
-                    "aic-cloud-region": "k8s_region_1"
-                  },
-                  "sdnc-request-header": {
-                    "svc-action": "activate",
-                    "svc-request-id": "bf81d48a-d5f9-42f2-bc49-9277f0e2a836",
-                    "svc-notification-url": "http://so-bpmn-infra.onap:8081/mso/WorkflowMessage/SDNCCallback/64780567-ecf5-41c9-af36-bb06f8ae0e5d"
-                  },
-                  "vnf-information": {
-                    "vnf-id": "fae319cc-68d6-496f-be1e-a09e133c71d4",
-                    "onap-model-information": {
-                      "model-name": "nginx-ingress-1",
-                      "model-invariant-uuid": "ebd1565b-a98f-4d77-9b91-6aefd51d040c",
-                      "model-version": "1.0",
-                      "model-customization-uuid": "69cff101-d1f2-4bf3-9697-57f52ba3c5dd",
-                      "model-uuid": "dfeccc32-2459-43bf-bfdd-36567e696090"
+                    "vnf-information": {
+                      "vnf-id": "fae319cc-68d6-496f-be1e-a09e133c71d4",
+                      "onap-model-information": {
+                        "model-name": "nginx-ingress-1",
+                        "model-invariant-uuid": "ebd1565b-a98f-4d77-9b91-6aefd51d040c",
+                        "model-version": "1.0",
+                        "model-customization-uuid": "69cff101-d1f2-4bf3-9697-57f52ba3c5dd",
+                        "model-uuid": "dfeccc32-2459-43bf-bfdd-36567e696090"
+                      },
+                      "vnf-type": "service-nginx-ingress-1/nginx-ingress-1 0",
+                      "vnf-name": "Python_ONAP_SDK_vnf_instance_2aff902a-4714-4d08-942d-d97b3a3b87c2"
+                    },
+                    "vf-module-information": {
+                      "onap-model-information": {
+                        "model-name": "NginxIngress1..nginx-ingress..module-0",
+                        "model-invariant-uuid": "caa22b8e-e0de-4d2c-9048-9a71d39afd91",
+                        "model-version": "1",
+                        "model-customization-uuid": "d6403fe2-ebe4-4fce-bec2-0218f61b2564",
+                        "model-uuid": "e5d2fe74-9534-4a7c-9a1b-f49ecf1105e3"
+                      },
+                      "vf-module-id": "269bda16-f40c-41a9-baef-e8905ab2b70e",
+                      "vf-module-type": "NginxIngress1..nginx-ingress..module-0",
+                      "from-preload": true
                     },
-                    "vnf-type": "service-nginx-ingress-1/nginx-ingress-1 0",
-                    "vnf-name": "Python_ONAP_SDK_vnf_instance_2aff902a-4714-4d08-942d-d97b3a3b87c2"
-                  },
-                  "vf-module-information": {
-                    "onap-model-information": {
-                      "model-name": "NginxIngress1..nginx-ingress..module-0",
-                      "model-invariant-uuid": "caa22b8e-e0de-4d2c-9048-9a71d39afd91",
-                      "model-version": "1",
-                      "model-customization-uuid": "d6403fe2-ebe4-4fce-bec2-0218f61b2564",
-                      "model-uuid": "e5d2fe74-9534-4a7c-9a1b-f49ecf1105e3"
+                    "request-information": {
+                      "request-id": "051f3665-002c-4e3c-b62e-f8c0b48ef12e",
+                      "request-action": "CreateVfModuleInstance",
+                      "source": "MSO"
                     },
-                    "vf-module-id": "269bda16-f40c-41a9-baef-e8905ab2b70e",
-                    "vf-module-type": "NginxIngress1..nginx-ingress..module-0",
-                    "from-preload": true
-                  },
-                  "request-information": {
-                    "request-id": "051f3665-002c-4e3c-b62e-f8c0b48ef12e",
-                    "request-action": "CreateVfModuleInstance",
-                    "source": "MSO"
-                  },
-                  "vf-module-level-oper-status": {
-                    "order-status": "Created",
-                    "last-rpc-action": "activate"
+                    "vf-module-level-oper-status": {
+                      "order-status": "Created",
+                      "last-rpc-action": "activate"
+                    }
                   }
                 }
-              }
-            ]
+              ]
+            }
           }
         }
-      }
-    ]
+      ]
+    }
   }
-}
-
-
-
+}
\ No newline at end of file
index aad2096..417f62f 100644 (file)
 {
-  "service-instance-id": "service1",
-  "service-data": {
-    "request-information": {
-      "request-id": "f5554477-51c7-4f8e-9183-f8968f3f86bf",
-      "request-action": "CreateServiceInstance",
-      "source": "MSO"
-    },
-    "service-request-input": {
-      "service-instance-name": "zrdm61asmsf01_svc"
-    },
-    "service-information": {
-      "service-id": "5c4f2d89-57a3-47e9-b49b-d3c63eb0b3ca",
-      "onap-model-information": {
-        "model-name": "service-nginx-ingress-1",
-        "model-invariant-uuid": "0fe6193d-2d65-4b8e-a4ee-a07821566b5e",
-        "model-version": "1.0",
-        "model-uuid": "48223a6a-f5e1-4354-95eb-f5ea014fc9df"
+  "service": {
+    "service-instance-id": "service1",
+    "service-data": {
+      "request-information": {
+        "request-id": "f5554477-51c7-4f8e-9183-f8968f3f86bf",
+        "request-action": "CreateServiceInstance",
+        "source": "MSO"
       },
-      "service-instance-id": "5c4f2d89-57a3-47e9-b49b-d3c63eb0b3ca",
-      "global-customer-id": "cust123",
-      "subscription-service-type": "test"
-    },
-    "service-topology": {
-      "service-topology-identifier": {
+      "service-request-input": {
+        "service-instance-name": "zrdm61asmsf01_svc"
+      },
+      "service-information": {
+        "service-id": "5c4f2d89-57a3-47e9-b49b-d3c63eb0b3ca",
+        "onap-model-information": {
+          "model-name": "service-nginx-ingress-1",
+          "model-invariant-uuid": "0fe6193d-2d65-4b8e-a4ee-a07821566b5e",
+          "model-version": "1.0",
+          "model-uuid": "48223a6a-f5e1-4354-95eb-f5ea014fc9df"
+        },
         "service-instance-id": "5c4f2d89-57a3-47e9-b49b-d3c63eb0b3ca",
-        "service-instance-name": "zrdm61asmsf01_svc",
-        "service-type": "test",
-        "global-customer-id": "cust123"
+        "global-customer-id": "cust123",
+        "subscription-service-type": "test"
       },
-      "onap-model-information": {
-        "model-name": "service-nginx-ingress-1",
-        "model-invariant-uuid": "0fe6193d-2d65-4b8e-a4ee-a07821566b5e",
-        "model-version": "1.0",
-        "model-uuid": "48223a6a-f5e1-4354-95eb-f5ea014fc9df"
-      }
-    },
-    "service-level-oper-status": {
-      "order-status": "Created",
-      "last-rpc-action": "assign",
-      "last-action": "CreateServiceInstance"
-    },
-    "sdnc-request-header": {
-      "svc-action": "assign",
-      "svc-request-id": "6d06a832-69da-4369-9d99-049767a39400"
-    },
-    "vnfs": {
-      "vnf": [
-        {
-          "vnf-id": "fae319cc-68d6-496f-be1e-a09e133c71d4",
-          "vnf-data": {
-            "vnf-level-oper-status": {
-              "order-status": "Created",
-              "last-rpc-action": "activate",
-              "last-action": "CreateVnfInstance"
-            },
-            "service-information": {
-              "service-id": "5c4f2d89-57a3-47e9-b49b-d3c63eb0b3ca",
-              "onap-model-information": {
-                "model-name": "service-nginx-ingress-1",
-                "model-invariant-uuid": "0fe6193d-2d65-4b8e-a4ee-a07821566b5e",
-                "model-version": "1.0",
-                "model-uuid": "48223a6a-f5e1-4354-95eb-f5ea014fc9df"
+      "service-topology": {
+        "service-topology-identifier": {
+          "service-instance-id": "5c4f2d89-57a3-47e9-b49b-d3c63eb0b3ca",
+          "service-instance-name": "zrdm61asmsf01_svc",
+          "service-type": "test",
+          "global-customer-id": "cust123"
+        },
+        "onap-model-information": {
+          "model-name": "service-nginx-ingress-1",
+          "model-invariant-uuid": "0fe6193d-2d65-4b8e-a4ee-a07821566b5e",
+          "model-version": "1.0",
+          "model-uuid": "48223a6a-f5e1-4354-95eb-f5ea014fc9df"
+        }
+      },
+      "service-level-oper-status": {
+        "order-status": "Created",
+        "last-rpc-action": "assign",
+        "last-action": "CreateServiceInstance"
+      },
+      "sdnc-request-header": {
+        "svc-action": "assign",
+        "svc-request-id": "6d06a832-69da-4369-9d99-049767a39400"
+      },
+      "vnfs": {
+        "vnf": [
+          {
+            "vnf-id": "fae319cc-68d6-496f-be1e-a09e133c71d4",
+            "vnf-data": {
+              "vnf-level-oper-status": {
+                "order-status": "Created",
+                "last-rpc-action": "activate",
+                "last-action": "CreateVnfInstance"
               },
-              "service-instance-id": "5c4f2d89-57a3-47e9-b49b-d3c63eb0b3ca",
-              "global-customer-id": "cust123",
-              "subscription-service-type": "test"
-            },
-            "sdnc-request-header": {
-              "svc-action": "activate",
-              "svc-request-id": "acf0c0db-106f-42e4-b77b-191e9d229eb9",
-              "svc-notification-url": "http://so-bpmn-infra.onap:8081/mso/WorkflowMessage/SDNCCallback/b8f92243-85cb-4954-970d-7e0159b9a48b"
-            },
-            "vnf-information": {
-              "vnf-id": "fae319cc-68d6-496f-be1e-a09e133c71d4",
-              "onap-model-information": {
-                "model-name": "nginx-ingress-1",
-                "model-invariant-uuid": "ebd1565b-a98f-4d77-9b91-6aefd51d040c",
-                "model-version": "1.0",
-                "model-customization-uuid": "69cff101-d1f2-4bf3-9697-57f52ba3c5dd",
-                "model-uuid": "dfeccc32-2459-43bf-bfdd-36567e696090"
+              "service-information": {
+                "service-id": "5c4f2d89-57a3-47e9-b49b-d3c63eb0b3ca",
+                "onap-model-information": {
+                  "model-name": "service-nginx-ingress-1",
+                  "model-invariant-uuid": "0fe6193d-2d65-4b8e-a4ee-a07821566b5e",
+                  "model-version": "1.0",
+                  "model-uuid": "48223a6a-f5e1-4354-95eb-f5ea014fc9df"
+                },
+                "service-instance-id": "5c4f2d89-57a3-47e9-b49b-d3c63eb0b3ca",
+                "global-customer-id": "cust123",
+                "subscription-service-type": "test"
               },
-              "vnf-type": "service-nginx-ingress-1/nginx-ingress-1 0",
-              "vnf-name": "Python_ONAP_SDK_vnf_instance_2aff902a-4714-4d08-942d-d97b3a3b87c2"
-            },
-            "request-information": {
-              "request-id": "c382d6d1-2108-4c39-ab7a-c3e67cdbc749",
-              "request-action": "CreateVnfInstance",
-              "source": "MSO"
-            },
-            "vnf-request-input": {
-              "vnf-name": "Python_ONAP_SDK_vnf_instance_2aff902a-4714-4d08-942d-d97b3a3b87c2",
-              "tenant": "k8s_tenant_1",
-              "cloud-owner": "k8sCloudOwner",
-              "aic-cloud-region": "k8s_region_1"
-            },
-            "vnf-topology": {
-              "onap-model-information": {
-                "model-name": "nginx-ingress-1",
-                "model-invariant-uuid": "ebd1565b-a98f-4d77-9b91-6aefd51d040c",
-                "model-version": "1.0",
-                "model-customization-uuid": "69cff101-d1f2-4bf3-9697-57f52ba3c5dd",
-                "model-uuid": "dfeccc32-2459-43bf-bfdd-36567e696090"
+              "sdnc-request-header": {
+                "svc-action": "activate",
+                "svc-request-id": "acf0c0db-106f-42e4-b77b-191e9d229eb9",
+                "svc-notification-url": "http://so-bpmn-infra.onap:8081/mso/WorkflowMessage/SDNCCallback/b8f92243-85cb-4954-970d-7e0159b9a48b"
               },
-              "tenant": "k8s_tenant_1",
-              "aic-clli": "complexMC",
-              "aic-cloud-region": "k8s_region_1",
-              "vnf-topology-identifier-structure": {
+              "vnf-information": {
                 "vnf-id": "fae319cc-68d6-496f-be1e-a09e133c71d4",
+                "onap-model-information": {
+                  "model-name": "nginx-ingress-1",
+                  "model-invariant-uuid": "ebd1565b-a98f-4d77-9b91-6aefd51d040c",
+                  "model-version": "1.0",
+                  "model-customization-uuid": "69cff101-d1f2-4bf3-9697-57f52ba3c5dd",
+                  "model-uuid": "dfeccc32-2459-43bf-bfdd-36567e696090"
+                },
                 "vnf-type": "service-nginx-ingress-1/nginx-ingress-1 0",
                 "vnf-name": "Python_ONAP_SDK_vnf_instance_2aff902a-4714-4d08-942d-d97b3a3b87c2"
               },
-              "vnf-resource-assignments": {
-                "availability-zones": {
-                  "availability-zone": [
-                    "k8s_availability_zone_1"
-                  ]
+              "request-information": {
+                "request-id": "c382d6d1-2108-4c39-ab7a-c3e67cdbc749",
+                "request-action": "CreateVnfInstance",
+                "source": "MSO"
+              },
+              "vnf-request-input": {
+                "vnf-name": "Python_ONAP_SDK_vnf_instance_2aff902a-4714-4d08-942d-d97b3a3b87c2",
+                "tenant": "k8s_tenant_1",
+                "cloud-owner": "k8sCloudOwner",
+                "aic-cloud-region": "k8s_region_1"
+              },
+              "vnf-topology": {
+                "onap-model-information": {
+                  "model-name": "nginx-ingress-1",
+                  "model-invariant-uuid": "ebd1565b-a98f-4d77-9b91-6aefd51d040c",
+                  "model-version": "1.0",
+                  "model-customization-uuid": "69cff101-d1f2-4bf3-9697-57f52ba3c5dd",
+                  "model-uuid": "dfeccc32-2459-43bf-bfdd-36567e696090"
+                },
+                "tenant": "k8s_tenant_1",
+                "aic-clli": "complexMC",
+                "aic-cloud-region": "k8s_region_1",
+                "vnf-topology-identifier-structure": {
+                  "vnf-id": "fae319cc-68d6-496f-be1e-a09e133c71d4",
+                  "vnf-type": "service-nginx-ingress-1/nginx-ingress-1 0",
+                  "vnf-name": "Python_ONAP_SDK_vnf_instance_2aff902a-4714-4d08-942d-d97b3a3b87c2"
+                },
+                "vnf-resource-assignments": {
+                  "availability-zones": {
+                    "availability-zone": [
+                      "k8s_availability_zone_1"
+                    ]
+                  }
                 }
-              }
-            },
-            "vf-modules": {
-              "vf-module": [
-                {
-                  "vf-module-id": "269bda16-f40c-41a9-baef-e8905ab2b70e",
-                  "vf-module-data": {
-                    "service-information": {
-                      "service-id": "5c4f2d89-57a3-47e9-b49b-d3c63eb0b3ca",
-                      "onap-model-information": {
-                        "model-name": "service-nginx-ingress-1",
-                        "model-invariant-uuid": "0fe6193d-2d65-4b8e-a4ee-a07821566b5e",
-                        "model-version": "1.0",
-                        "model-uuid": "48223a6a-f5e1-4354-95eb-f5ea014fc9df"
+              },
+              "vf-modules": {
+                "vf-module": [
+                  {
+                    "vf-module-id": "269bda16-f40c-41a9-baef-e8905ab2b70e",
+                    "vf-module-data": {
+                      "service-information": {
+                        "service-id": "5c4f2d89-57a3-47e9-b49b-d3c63eb0b3ca",
+                        "onap-model-information": {
+                          "model-name": "service-nginx-ingress-1",
+                          "model-invariant-uuid": "0fe6193d-2d65-4b8e-a4ee-a07821566b5e",
+                          "model-version": "1.0",
+                          "model-uuid": "48223a6a-f5e1-4354-95eb-f5ea014fc9df"
+                        },
+                        "service-instance-id": "5c4f2d89-57a3-47e9-b49b-d3c63eb0b3ca",
+                        "global-customer-id": "cust123",
+                        "subscription-service-type": "test"
                       },
-                      "service-instance-id": "5c4f2d89-57a3-47e9-b49b-d3c63eb0b3ca",
-                      "global-customer-id": "cust123",
-                      "subscription-service-type": "test"
-                    },
-                    "vf-module-topology": {
-                      "onap-model-information": {
-                        "model-name": "NginxIngress1..nginx-ingress..module-0",
-                        "model-invariant-uuid": "caa22b8e-e0de-4d2c-9048-9a71d39afd91",
-                        "model-version": "1",
-                        "model-customization-uuid": "d6403fe2-ebe4-4fce-bec2-0218f61b2564",
-                        "model-uuid": "e5d2fe74-9534-4a7c-9a1b-f49ecf1105e3"
+                      "vf-module-topology": {
+                        "onap-model-information": {
+                          "model-name": "NginxIngress1..nginx-ingress..module-0",
+                          "model-invariant-uuid": "caa22b8e-e0de-4d2c-9048-9a71d39afd91",
+                          "model-version": "1",
+                          "model-customization-uuid": "d6403fe2-ebe4-4fce-bec2-0218f61b2564",
+                          "model-uuid": "e5d2fe74-9534-4a7c-9a1b-f49ecf1105e3"
+                        },
+                        "vf-module-parameters": {
+                          "param": [
+                            {
+                              "name": "availability_zone_0",
+                              "value": "k8s_availability_zone_1"
+                            },
+                            {
+                              "name": "k8s-rb-profile-name",
+                              "value": "default"
+                            }
+                          ]
+                        },
+                        "tenant": "k8s_tenant_1",
+                        "sdnc-generated-cloud-resources": true,
+                        "aic-clli": "complexMC",
+                        "vf-module-topology-identifier": {
+                          "vf-module-type": "NginxIngress1..nginx-ingress..module-0",
+                          "vf-module-id": "269bda16-f40c-41a9-baef-e8905ab2b70e",
+                          "vf-module-name": "Python_ONAP_SDK_vf_module_instance_678cc889-0c89-40f3-9f5b-1f475d5c4ebb"
+                        },
+                        "aic-cloud-region": "k8s_region_1"
                       },
-                      "vf-module-parameters": {
-                        "param": [
-                          {
-                            "name": "availability_zone_0",
-                            "value": "k8s_availability_zone_1"
-                          },
-                          {
-                            "name": "k8s-rb-profile-name",
-                            "value": "default"
-                          }
-                        ]
+                      "vf-module-request-input": {
+                        "vf-module-name": "Python_ONAP_SDK_vf_module_instance_678cc889-0c89-40f3-9f5b-1f475d5c4ebb",
+                        "tenant": "k8s_tenant_1",
+                        "cloud-owner": "k8sCloudOwner",
+                        "aic-cloud-region": "k8s_region_1"
                       },
-                      "tenant": "k8s_tenant_1",
-                      "sdnc-generated-cloud-resources": true,
-                      "aic-clli": "complexMC",
-                      "vf-module-topology-identifier": {
-                        "vf-module-type": "NginxIngress1..nginx-ingress..module-0",
-                        "vf-module-id": "269bda16-f40c-41a9-baef-e8905ab2b70e",
-                        "vf-module-name": "Python_ONAP_SDK_vf_module_instance_678cc889-0c89-40f3-9f5b-1f475d5c4ebb"
+                      "sdnc-request-header": {
+                        "svc-action": "activate",
+                        "svc-request-id": "bf81d48a-d5f9-42f2-bc49-9277f0e2a836",
+                        "svc-notification-url": "http://so-bpmn-infra.onap:8081/mso/WorkflowMessage/SDNCCallback/64780567-ecf5-41c9-af36-bb06f8ae0e5d"
                       },
-                      "aic-cloud-region": "k8s_region_1"
-                    },
-                    "vf-module-request-input": {
-                      "vf-module-name": "Python_ONAP_SDK_vf_module_instance_678cc889-0c89-40f3-9f5b-1f475d5c4ebb",
-                      "tenant": "k8s_tenant_1",
-                      "cloud-owner": "k8sCloudOwner",
-                      "aic-cloud-region": "k8s_region_1"
-                    },
-                    "sdnc-request-header": {
-                      "svc-action": "activate",
-                      "svc-request-id": "bf81d48a-d5f9-42f2-bc49-9277f0e2a836",
-                      "svc-notification-url": "http://so-bpmn-infra.onap:8081/mso/WorkflowMessage/SDNCCallback/64780567-ecf5-41c9-af36-bb06f8ae0e5d"
-                    },
-                    "vnf-information": {
-                      "vnf-id": "fae319cc-68d6-496f-be1e-a09e133c71d4",
-                      "onap-model-information": {
-                        "model-name": "nginx-ingress-1",
-                        "model-invariant-uuid": "ebd1565b-a98f-4d77-9b91-6aefd51d040c",
-                        "model-version": "1.0",
-                        "model-customization-uuid": "69cff101-d1f2-4bf3-9697-57f52ba3c5dd",
-                        "model-uuid": "dfeccc32-2459-43bf-bfdd-36567e696090"
+                      "vnf-information": {
+                        "vnf-id": "fae319cc-68d6-496f-be1e-a09e133c71d4",
+                        "onap-model-information": {
+                          "model-name": "nginx-ingress-1",
+                          "model-invariant-uuid": "ebd1565b-a98f-4d77-9b91-6aefd51d040c",
+                          "model-version": "1.0",
+                          "model-customization-uuid": "69cff101-d1f2-4bf3-9697-57f52ba3c5dd",
+                          "model-uuid": "dfeccc32-2459-43bf-bfdd-36567e696090"
+                        },
+                        "vnf-type": "service-nginx-ingress-1/nginx-ingress-1 0",
+                        "vnf-name": "Python_ONAP_SDK_vnf_instance_2aff902a-4714-4d08-942d-d97b3a3b87c2"
                       },
-                      "vnf-type": "service-nginx-ingress-1/nginx-ingress-1 0",
-                      "vnf-name": "Python_ONAP_SDK_vnf_instance_2aff902a-4714-4d08-942d-d97b3a3b87c2"
-                    },
-                    "vf-module-information": {
-                      "onap-model-information": {
-                        "model-name": "NginxIngress1..nginx-ingress..module-0",
-                        "model-invariant-uuid": "caa22b8e-e0de-4d2c-9048-9a71d39afd91",
-                        "model-version": "1",
-                        "model-customization-uuid": "d6403fe2-ebe4-4fce-bec2-0218f61b2564",
-                        "model-uuid": "e5d2fe74-9534-4a7c-9a1b-f49ecf1105e3"
+                      "vf-module-information": {
+                        "onap-model-information": {
+                          "model-name": "NginxIngress1..nginx-ingress..module-0",
+                          "model-invariant-uuid": "caa22b8e-e0de-4d2c-9048-9a71d39afd91",
+                          "model-version": "1",
+                          "model-customization-uuid": "d6403fe2-ebe4-4fce-bec2-0218f61b2564",
+                          "model-uuid": "e5d2fe74-9534-4a7c-9a1b-f49ecf1105e3"
+                        },
+                        "vf-module-id": "269bda16-f40c-41a9-baef-e8905ab2b70e",
+                        "vf-module-type": "NginxIngress1..nginx-ingress..module-0",
+                        "from-preload": true
                       },
-                      "vf-module-id": "269bda16-f40c-41a9-baef-e8905ab2b70e",
-                      "vf-module-type": "NginxIngress1..nginx-ingress..module-0",
-                      "from-preload": true
-                    },
-                    "request-information": {
-                      "request-id": "051f3665-002c-4e3c-b62e-f8c0b48ef12e",
-                      "request-action": "CreateVfModuleInstance",
-                      "source": "MSO"
-                    },
-                    "vf-module-level-oper-status": {
-                      "order-status": "Created",
-                      "last-rpc-action": "activate"
+                      "request-information": {
+                        "request-id": "051f3665-002c-4e3c-b62e-f8c0b48ef12e",
+                        "request-action": "CreateVfModuleInstance",
+                        "source": "MSO"
+                      },
+                      "vf-module-level-oper-status": {
+                        "order-status": "Created",
+                        "last-rpc-action": "activate"
+                      }
                     }
                   }
-                }
-              ]
+                ]
+              }
             }
           }
-        }
-      ]
+        ]
+      }
+    },
+    "service-status": {
+      "final-indicator": "Y",
+      "rpc-action": "activate",
+      "rpc-name": "vf-module-topology-operation",
+      "response-code": "200",
+      "response-timestamp": "2020-06-24T13:06:24.525Z",
+      "response-message": "",
+      "action": "CreateVfModuleInstance",
+      "request-status": "synccomplete"
     }
-  },
-  "service-status": {
-    "final-indicator": "Y",
-    "rpc-action": "activate",
-    "rpc-name": "vf-module-topology-operation",
-    "response-code": "200",
-    "response-timestamp": "2020-06-24T13:06:24.525Z",
-    "response-message": "",
-    "action": "CreateVfModuleInstance",
-    "request-status": "synccomplete"
   }
-}
-
-
+}
\ No newline at end of file
diff --git a/ms/gra/gra-app/src/test/resources/service1-services.json b/ms/gra/gra-app/src/test/resources/service1-services.json
new file mode 100644 (file)
index 0000000..28117b9
--- /dev/null
@@ -0,0 +1,237 @@
+{
+  "services": {
+    "service": [
+      {
+        "service-instance-id": "5c4f2d89-57a3-47e9-b49b-d3c63eb0b3ca",
+        "service-data": {
+          "request-information": {
+            "request-id": "f5554477-51c7-4f8e-9183-f8968f3f86bf",
+            "request-action": "CreateServiceInstance",
+            "source": "MSO"
+          },
+          "service-request-input": {
+            "service-instance-name": "zrdm61asmsf01_svc"
+          },
+          "service-information": {
+            "service-id": "5c4f2d89-57a3-47e9-b49b-d3c63eb0b3ca",
+            "onap-model-information": {
+              "model-name": "service-nginx-ingress-1",
+              "model-invariant-uuid": "0fe6193d-2d65-4b8e-a4ee-a07821566b5e",
+              "model-version": "1.0",
+              "model-uuid": "48223a6a-f5e1-4354-95eb-f5ea014fc9df"
+            },
+            "service-instance-id": "5c4f2d89-57a3-47e9-b49b-d3c63eb0b3ca",
+            "global-customer-id": "Demonstration",
+            "subscription-service-type": "service-nginx-ingress-1"
+          },
+          "service-topology": {
+            "service-topology-identifier": {
+              "service-instance-id": "5c4f2d89-57a3-47e9-b49b-d3c63eb0b3ca",
+              "service-instance-name": "zrdm61asmsf01_svc",
+              "service-type": "service-nginx-ingress-1",
+              "global-customer-id": "Demonstration"
+            },
+            "onap-model-information": {
+              "model-name": "service-nginx-ingress-1",
+              "model-invariant-uuid": "0fe6193d-2d65-4b8e-a4ee-a07821566b5e",
+              "model-version": "1.0",
+              "model-uuid": "48223a6a-f5e1-4354-95eb-f5ea014fc9df"
+            }
+          },
+          "service-level-oper-status": {
+            "order-status": "Created",
+            "last-rpc-action": "assign",
+            "last-action": "CreateServiceInstance"
+          },
+          "sdnc-request-header": {
+            "svc-action": "assign",
+            "svc-request-id": "6d06a832-69da-4369-9d99-049767a39400"
+          },
+          "vnfs": {
+            "vnf": [
+              {
+                "vnf-id": "fae319cc-68d6-496f-be1e-a09e133c71d4",
+                "vnf-data": {
+                  "vnf-level-oper-status": {
+                    "order-status": "Created",
+                    "last-rpc-action": "activate",
+                    "last-action": "CreateVnfInstance"
+                  },
+                  "service-information": {
+                    "service-id": "5c4f2d89-57a3-47e9-b49b-d3c63eb0b3ca",
+                    "onap-model-information": {
+                      "model-name": "service-nginx-ingress-1",
+                      "model-invariant-uuid": "0fe6193d-2d65-4b8e-a4ee-a07821566b5e",
+                      "model-version": "1.0",
+                      "model-uuid": "48223a6a-f5e1-4354-95eb-f5ea014fc9df"
+                    },
+                    "service-instance-id": "5c4f2d89-57a3-47e9-b49b-d3c63eb0b3ca",
+                    "global-customer-id": "Demonstration",
+                    "subscription-service-type": "service-nginx-ingress-1"
+                  },
+                  "sdnc-request-header": {
+                    "svc-action": "activate",
+                    "svc-request-id": "acf0c0db-106f-42e4-b77b-191e9d229eb9",
+                    "svc-notification-url": "http://so-bpmn-infra.onap:8081/mso/WorkflowMessage/SDNCCallback/b8f92243-85cb-4954-970d-7e0159b9a48b"
+                  },
+                  "vnf-information": {
+                    "vnf-id": "fae319cc-68d6-496f-be1e-a09e133c71d4",
+                    "onap-model-information": {
+                      "model-name": "nginx-ingress-1",
+                      "model-invariant-uuid": "ebd1565b-a98f-4d77-9b91-6aefd51d040c",
+                      "model-version": "1.0",
+                      "model-customization-uuid": "69cff101-d1f2-4bf3-9697-57f52ba3c5dd",
+                      "model-uuid": "dfeccc32-2459-43bf-bfdd-36567e696090"
+                    },
+                    "vnf-type": "service-nginx-ingress-1/nginx-ingress-1 0",
+                    "vnf-name": "Python_ONAP_SDK_vnf_instance_2aff902a-4714-4d08-942d-d97b3a3b87c2"
+                  },
+                  "request-information": {
+                    "request-id": "c382d6d1-2108-4c39-ab7a-c3e67cdbc749",
+                    "request-action": "CreateVnfInstance",
+                    "source": "MSO"
+                  },
+                  "vnf-request-input": {
+                    "vnf-name": "Python_ONAP_SDK_vnf_instance_2aff902a-4714-4d08-942d-d97b3a3b87c2",
+                    "tenant": "k8s_tenant_1",
+                    "cloud-owner": "k8sCloudOwner",
+                    "aic-cloud-region": "k8s_region_1"
+                  },
+                  "vnf-topology": {
+                    "onap-model-information": {
+                      "model-name": "nginx-ingress-1",
+                      "model-invariant-uuid": "ebd1565b-a98f-4d77-9b91-6aefd51d040c",
+                      "model-version": "1.0",
+                      "model-customization-uuid": "69cff101-d1f2-4bf3-9697-57f52ba3c5dd",
+                      "model-uuid": "dfeccc32-2459-43bf-bfdd-36567e696090"
+                    },
+                    "tenant": "k8s_tenant_1",
+                    "aic-clli": "complexMC",
+                    "aic-cloud-region": "k8s_region_1",
+                    "vnf-topology-identifier-structure": {
+                      "vnf-id": "fae319cc-68d6-496f-be1e-a09e133c71d4",
+                      "vnf-type": "service-nginx-ingress-1/nginx-ingress-1 0",
+                      "vnf-name": "Python_ONAP_SDK_vnf_instance_2aff902a-4714-4d08-942d-d97b3a3b87c2"
+                    },
+                    "vnf-resource-assignments": {
+                      "availability-zones": {
+                        "availability-zone": [
+                          "k8s_availability_zone_1"
+                        ]
+                      }
+                    }
+                  },
+                  "vf-modules": {
+                    "vf-module": [
+                      {
+                        "vf-module-id": "269bda16-f40c-41a9-baef-e8905ab2b70e",
+                        "vf-module-data": {
+                          "service-information": {
+                            "service-id": "5c4f2d89-57a3-47e9-b49b-d3c63eb0b3ca",
+                            "onap-model-information": {
+                              "model-name": "service-nginx-ingress-1",
+                              "model-invariant-uuid": "0fe6193d-2d65-4b8e-a4ee-a07821566b5e",
+                              "model-version": "1.0",
+                              "model-uuid": "48223a6a-f5e1-4354-95eb-f5ea014fc9df"
+                            },
+                            "service-instance-id": "5c4f2d89-57a3-47e9-b49b-d3c63eb0b3ca",
+                            "global-customer-id": "Demonstration",
+                            "subscription-service-type": "service-nginx-ingress-1"
+                          },
+                          "vf-module-topology": {
+                            "onap-model-information": {
+                              "model-name": "NginxIngress1..nginx-ingress..module-0",
+                              "model-invariant-uuid": "caa22b8e-e0de-4d2c-9048-9a71d39afd91",
+                              "model-version": "1",
+                              "model-customization-uuid": "d6403fe2-ebe4-4fce-bec2-0218f61b2564",
+                              "model-uuid": "e5d2fe74-9534-4a7c-9a1b-f49ecf1105e3"
+                            },
+                            "vf-module-parameters": {
+                              "param": [
+                                {
+                                  "name": "availability_zone_0",
+                                  "value": "k8s_availability_zone_1"
+                                },
+                                {
+                                  "name": "k8s-rb-profile-name",
+                                  "value": "default"
+                                }
+                              ]
+                            },
+                            "tenant": "k8s_tenant_1",
+                            "sdnc-generated-cloud-resources": true,
+                            "aic-clli": "complexMC",
+                            "vf-module-topology-identifier": {
+                              "vf-module-type": "NginxIngress1..nginx-ingress..module-0",
+                              "vf-module-id": "269bda16-f40c-41a9-baef-e8905ab2b70e",
+                              "vf-module-name": "Python_ONAP_SDK_vf_module_instance_678cc889-0c89-40f3-9f5b-1f475d5c4ebb"
+                            },
+                            "aic-cloud-region": "k8s_region_1"
+                          },
+                          "vf-module-request-input": {
+                            "vf-module-name": "Python_ONAP_SDK_vf_module_instance_678cc889-0c89-40f3-9f5b-1f475d5c4ebb",
+                            "tenant": "k8s_tenant_1",
+                            "cloud-owner": "k8sCloudOwner",
+                            "aic-cloud-region": "k8s_region_1"
+                          },
+                          "sdnc-request-header": {
+                            "svc-action": "activate",
+                            "svc-request-id": "bf81d48a-d5f9-42f2-bc49-9277f0e2a836",
+                            "svc-notification-url": "http://so-bpmn-infra.onap:8081/mso/WorkflowMessage/SDNCCallback/64780567-ecf5-41c9-af36-bb06f8ae0e5d"
+                          },
+                          "vnf-information": {
+                            "vnf-id": "fae319cc-68d6-496f-be1e-a09e133c71d4",
+                            "onap-model-information": {
+                              "model-name": "nginx-ingress-1",
+                              "model-invariant-uuid": "ebd1565b-a98f-4d77-9b91-6aefd51d040c",
+                              "model-version": "1.0",
+                              "model-customization-uuid": "69cff101-d1f2-4bf3-9697-57f52ba3c5dd",
+                              "model-uuid": "dfeccc32-2459-43bf-bfdd-36567e696090"
+                            },
+                            "vnf-type": "service-nginx-ingress-1/nginx-ingress-1 0",
+                            "vnf-name": "Python_ONAP_SDK_vnf_instance_2aff902a-4714-4d08-942d-d97b3a3b87c2"
+                          },
+                          "vf-module-information": {
+                            "onap-model-information": {
+                              "model-name": "NginxIngress1..nginx-ingress..module-0",
+                              "model-invariant-uuid": "caa22b8e-e0de-4d2c-9048-9a71d39afd91",
+                              "model-version": "1",
+                              "model-customization-uuid": "d6403fe2-ebe4-4fce-bec2-0218f61b2564",
+                              "model-uuid": "e5d2fe74-9534-4a7c-9a1b-f49ecf1105e3"
+                            },
+                            "vf-module-id": "269bda16-f40c-41a9-baef-e8905ab2b70e",
+                            "vf-module-type": "NginxIngress1..nginx-ingress..module-0",
+                            "from-preload": true
+                          },
+                          "request-information": {
+                            "request-id": "051f3665-002c-4e3c-b62e-f8c0b48ef12e",
+                            "request-action": "CreateVfModuleInstance",
+                            "source": "MSO"
+                          },
+                          "vf-module-level-oper-status": {
+                            "order-status": "Created",
+                            "last-rpc-action": "activate"
+                          }
+                        }
+                      }
+                    ]
+                  }
+                }
+              }
+            ]
+          }
+        },
+        "service-status": {
+          "final-indicator": "Y",
+          "rpc-action": "activate",
+          "rpc-name": "vf-module-topology-operation",
+          "response-code": "200",
+          "response-timestamp": "2020-06-24T13:06:24.525Z",
+          "response-message": "",
+          "action": "CreateVfModuleInstance",
+          "request-status": "synccomplete"
+        }
+      }
+    ]
+  }
+}
\ No newline at end of file
index ca763d3..9dae1fd 100644 (file)
@@ -1,4 +1,5 @@
 {
+  "service-status": {
   "final-indicator": "Y",
   "rpc-action": "activate",
   "rpc-name": "vf-module-topology-operation",
@@ -7,4 +8,5 @@
   "response-message": "",
   "action": "CreateVfModuleInstance",
   "request-status": "synccomplete"
+  }
 }
\ No newline at end of file
index 67e5b3c..095cc80 100644 (file)
@@ -1,79 +1,81 @@
 {
-  "vf-module-data": {
-    "vf-module-level-oper-status": {
-      "order-status": "PendingCreate",
-      "last-rpc-action": "assign"
-    },
-    "request-information": {
-      "request-action": "CreateVfModuleInstance",
-      "source": "simulator",
-      "request-id": "c594915b-cd49-4276-8e6b-536caa5f5285"
-    },
-    "sdnc-request-header": {
-      "svc-request-id": "5c4f2d89-57a3-47e9-b49b-d3c63eb0b3ca",
-      "svc-action": "assign"
-    },
-    "service-information": {
-      "onap-model-information": {
-        "model-name": "vcpesvc_vbng_0412a",
-        "model-version": "3.0",
-        "model-uuid": "12eb33fa-b221-4d87-939c-d808b5799a7c",
-        "model-invariant-uuid": "ead151e2-e18a-44fc-b6ac-3ae3d819dcd6"
+  "vf-module": {
+    "vf-module-data": {
+      "vf-module-level-oper-status": {
+        "order-status": "PendingCreate",
+        "last-rpc-action": "assign"
       },
-      "subscription-service-type": "VIRTUAL USP",
-      "service-id": "5c4f2d89-57a3-47e9-b49b-d3c63eb0b3cac",
-      "global-customer-id": "cust123",
-      "service-instance-id": "5c4f2d89-57a3-47e9-b49b-d3c63eb0b3ca"
-    },
-    "vf-module-information": {
-      "onap-model-information": {
-        "model-name": "SmsfNc2578..smsf_base..module-0",
-        "model-version": "3",
-        "model-customization-uuid": "59ffe5ba-cfaf-4e83-a2f3-159522dcebac",
-        "model-uuid": "513cc9fc-fff5-4c46-9728-393437536c4d",
-        "model-invariant-uuid": "7ca7567c-f42c-4ed8-bcde-f8971b92d90a"
+      "request-information": {
+        "request-action": "CreateVfModuleInstance",
+        "source": "simulator",
+        "request-id": "c594915b-cd49-4276-8e6b-536caa5f5285"
       },
-      "vf-module-id": "45841173-3729-4a1d-a811-a3bde399e22d",
-      "from-preload": true,
-      "vf-module-type": "SmsfNc2578..smsf_base..module-0"
-    },
-    "vf-module-request-input": {
-      "aic-cloud-region": "rdm61a",
-      "cloud-owner": "att-nc",
-      "tenant": "4714fe06cc24414c914c51ca0aa1bf84",
-      "vf-module-name": "vfmodule1",
-      "vf-module-input-parameters": {}
-    },
-    "vnf-information": {
-      "onap-model-information": {
-        "model-name": "vcpevsp_vgmux_0412 ",
-        "model-version": "1.0",
-        "model-customization-uuid": "5724fcc8-2ae2-45ce-8d44-795092b85dee",
-        "model-uuid": "ba3b8981-9a9c-4945-92aa-486234ec321f",
-        "model-invariant-uuid": "b3dc6465-942c-42af-8464-2bf85b6e504b"
+      "sdnc-request-header": {
+        "svc-request-id": "5c4f2d89-57a3-47e9-b49b-d3c63eb0b3ca",
+        "svc-action": "assign"
       },
-      "vnf-id": "fae319cc-68d6-496f-be1e-a09e133c71d4",
-      "vnf-name": "zrdm61asmsf01",
-      "vnf-type": "SMSF-NC2-578-SVC/SMSF-NC2-578"
-    },
-    "vf-module-topology": {
-      "onap-model-information": {
-        "model-name": "SmsfNc2578..smsf_base..module-0",
-        "model-version": "3",
-        "model-customization-uuid": "59ffe5ba-cfaf-4e83-a2f3-159522dcebac",
-        "model-uuid": "513cc9fc-fff5-4c46-9728-393437536c4d",
-        "model-invariant-uuid": "7ca7567c-f42c-4ed8-bcde-f8971b92d90a"
+      "service-information": {
+        "onap-model-information": {
+          "model-name": "vcpesvc_vbng_0412a",
+          "model-version": "3.0",
+          "model-uuid": "12eb33fa-b221-4d87-939c-d808b5799a7c",
+          "model-invariant-uuid": "ead151e2-e18a-44fc-b6ac-3ae3d819dcd6"
+        },
+        "subscription-service-type": "VIRTUAL USP",
+        "service-id": "5c4f2d89-57a3-47e9-b49b-d3c63eb0b3cac",
+        "global-customer-id": "cust123",
+        "service-instance-id": "5c4f2d89-57a3-47e9-b49b-d3c63eb0b3ca"
       },
-      "aic-cloud-region": "rdm61a",
-      "tenant": "4714fe06cc24414c914c51ca0aa1bf84",
-      "vf-module-topology-identifier": {
-        "vf-module-name": "vfmodule1",
+      "vf-module-information": {
+        "onap-model-information": {
+          "model-name": "SmsfNc2578..smsf_base..module-0",
+          "model-version": "3",
+          "model-customization-uuid": "59ffe5ba-cfaf-4e83-a2f3-159522dcebac",
+          "model-uuid": "513cc9fc-fff5-4c46-9728-393437536c4d",
+          "model-invariant-uuid": "7ca7567c-f42c-4ed8-bcde-f8971b92d90a"
+        },
         "vf-module-id": "45841173-3729-4a1d-a811-a3bde399e22d",
+        "from-preload": true,
         "vf-module-type": "SmsfNc2578..smsf_base..module-0"
       },
-      "vf-module-parameters": {},
-      "sdnc-generated-cloud-resources": true
-    }
-  },
-  "vf-module-id": "45841173-3729-4a1d-a811-a3bde399e22d"
+      "vf-module-request-input": {
+        "aic-cloud-region": "rdm61a",
+        "cloud-owner": "att-nc",
+        "tenant": "4714fe06cc24414c914c51ca0aa1bf84",
+        "vf-module-name": "vfmodule1",
+        "vf-module-input-parameters": {}
+      },
+      "vnf-information": {
+        "onap-model-information": {
+          "model-name": "vcpevsp_vgmux_0412 ",
+          "model-version": "1.0",
+          "model-customization-uuid": "5724fcc8-2ae2-45ce-8d44-795092b85dee",
+          "model-uuid": "ba3b8981-9a9c-4945-92aa-486234ec321f",
+          "model-invariant-uuid": "b3dc6465-942c-42af-8464-2bf85b6e504b"
+        },
+        "vnf-id": "fae319cc-68d6-496f-be1e-a09e133c71d4",
+        "vnf-name": "zrdm61asmsf01",
+        "vnf-type": "SMSF-NC2-578-SVC/SMSF-NC2-578"
+      },
+      "vf-module-topology": {
+        "onap-model-information": {
+          "model-name": "SmsfNc2578..smsf_base..module-0",
+          "model-version": "3",
+          "model-customization-uuid": "59ffe5ba-cfaf-4e83-a2f3-159522dcebac",
+          "model-uuid": "513cc9fc-fff5-4c46-9728-393437536c4d",
+          "model-invariant-uuid": "7ca7567c-f42c-4ed8-bcde-f8971b92d90a"
+        },
+        "aic-cloud-region": "rdm61a",
+        "tenant": "4714fe06cc24414c914c51ca0aa1bf84",
+        "vf-module-topology-identifier": {
+          "vf-module-name": "vfmodule1",
+          "vf-module-id": "45841173-3729-4a1d-a811-a3bde399e22d",
+          "vf-module-type": "SmsfNc2578..smsf_base..module-0"
+        },
+        "vf-module-parameters": {},
+        "sdnc-generated-cloud-resources": true
+      }
+    },
+    "vf-module-id": "45841173-3729-4a1d-a811-a3bde399e22d"
+  }
 }
\ No newline at end of file
index 1778cab..42e2583 100644 (file)
@@ -1,5 +1,5 @@
 {
-  "vnf-level-oper-status": {
+  "oper-status": {
     "create-timestamp": "string",
     "last-action": "CreateNetworkInstance",
     "last-order-status": "Active",
index d435c4a..564adc9 100644 (file)
@@ -1,34 +1,40 @@
 {
-    "contrail-network-fqdn": "string",
-    "is-trunked": true,
-    "network-id": "69f09279-8af1-4475-83cf-7e357c579dbf",
-    "network-name": "test-network-name",
-    "network-role": "test-network-role",
-    "neutron-id": "812562dd-9d91-4ba6-9c3e-e52bf1cd4cc6",
-    "related-networks": {
-        "related-network": [{
-            "network-id": "69f09279-8af1-4475-83cf-7e357c579dbf",
-            "network-role": "test-network-role",
-            "vlan-tags": {
-                "is-private": true,
-                "lower-tag-id": 0,
-                "upper-tag-id": 0,
-                "vlan-interface": "string"
-            }
-        }]
-    },
-    "segmentation-id": "string",
-    "subnets-data": {
-        "subnet-data": [{
-            "cidr-mask": "string",
-            "dhcp-enabled": "Y",
-            "gateway-address": "string",
-            "ip-version": "string",
-            "network-start-address": "string",
-            "sdnc-subnet-id": "string",
-            "subnet-id": "string",
-            "subnet-name": "string",
-            "subnet-role": "string"
-        }]
+    "vnf-network": {
+        "contrail-network-fqdn": "string",
+        "is-trunked": true,
+        "network-id": "69f09279-8af1-4475-83cf-7e357c579dbf",
+        "network-name": "test-network-name",
+        "network-role": "test-network-role",
+        "neutron-id": "812562dd-9d91-4ba6-9c3e-e52bf1cd4cc6",
+        "related-networks": {
+            "related-network": [
+                {
+                    "network-id": "69f09279-8af1-4475-83cf-7e357c579dbf",
+                    "network-role": "test-network-role",
+                    "vlan-tags": {
+                        "is-private": true,
+                        "lower-tag-id": 0,
+                        "upper-tag-id": 0,
+                        "vlan-interface": "string"
+                    }
+                }
+            ]
+        },
+        "segmentation-id": "string",
+        "subnets-data": {
+            "subnet-data": [
+                {
+                    "cidr-mask": "string",
+                    "dhcp-enabled": "Y",
+                    "gateway-address": "string",
+                    "ip-version": "string",
+                    "network-start-address": "string",
+                    "sdnc-subnet-id": "string",
+                    "subnet-id": "string",
+                    "subnet-name": "string",
+                    "subnet-role": "string"
+                }
+            ]
+        }
     }
 }
\ No newline at end of file
diff --git a/ms/gra/gra-app/src/test/resources/vnf.json b/ms/gra/gra-app/src/test/resources/vnf.json
new file mode 100644 (file)
index 0000000..84d1a45
--- /dev/null
@@ -0,0 +1,603 @@
+{
+  "vnf": {
+    "vnf-data": {
+      "request-information": {
+        "notification-url": "https://dev.null",
+        "order-number": "Order-123",
+        "order-version": "Order-v22",
+        "request-action": "CreateNetworkInstance",
+        "request-id": "a44e8401-2c62-47df-98be-9a09f6cbd996",
+        "source": "unit-test"
+      },
+      "sdnc-request-header": {
+        "svc-action": "assign",
+        "svc-notification-url": "https://dev.null",
+        "svc-request-id": "9c06a7c6-be3a-4530-bdd8-c65b58f123a5"
+      },
+      "service-information": {
+        "global-customer-id": "cust123",
+        "onap-model-information": {
+          "model-customization-uuid": "602c6bcc-6cfa-41cb-a8a7-968b38d5935f",
+          "model-invariant-uuid": "bdb4f943-c9be-4742-b976-a34607f3687e",
+          "model-name": "SMSF-NC2-578",
+          "model-uuid": "86c76b5d-fa8d-4034-b79a-1cc4326021a9",
+          "model-version": "3.0"
+        },
+        "service-id": "5c4f2d89-57a3-47e9-b49b-d3c63eb0b3ca",
+        "service-instance-id": "5c4f2d89-57a3-47e9-b49b-d3c63eb0b3ca",
+        "subscriber-name": "unit-test",
+        "subscription-service-type": "unit-test"
+      },
+      "vf-modules": {
+        "vf-module": [
+          {
+            "vf-module-data": {
+              "request-information": {
+                "order-number": "Order-123",
+                "order-version": "Order-v22",
+                "request-action": "CreateNetworkInstance",
+                "request-id": "a44e8401-2c62-47df-98be-9a09f6cbd996",
+                "source": "unit-test"
+              },
+              "sdnc-request-header": {
+                "svc-action": "assign",
+                "svc-request-id": "9c06a7c6-be3a-4530-bdd8-c65b58f123a5"
+              },
+              "service-information": {
+                "global-customer-id": "cust123",
+                "onap-model-information": {
+                  "model-customization-uuid": "602c6bcc-6cfa-41cb-a8a7-968b38d5935f",
+                  "model-invariant-uuid": "bdb4f943-c9be-4742-b976-a34607f3687e",
+                  "model-name": "SMSF-NC2-578",
+                  "model-uuid": "86c76b5d-fa8d-4034-b79a-1cc4326021a9",
+                  "model-version": "3.0"
+                },
+                "service-id": "5c4f2d89-57a3-47e9-b49b-d3c63eb0b3ca",
+                "service-instance-id": "5c4f2d89-57a3-47e9-b49b-d3c63eb0b3ca",
+                "subscriber-name": "unit-test",
+                "subscription-service-type": "unit-test"
+              },
+              "vf-module-information": {
+                "from-preload": true,
+                "onap-model-information": {
+                  "model-customization-uuid": "602c6bcc-6cfa-41cb-a8a7-968b38d5935f",
+                  "model-invariant-uuid": "bdb4f943-c9be-4742-b976-a34607f3687e",
+                  "model-name": "SMSF-NC2-578",
+                  "model-uuid": "86c76b5d-fa8d-4034-b79a-1cc4326021a9",
+                  "model-version": "3.0"
+                },
+                "vf-module-id": "45841173-3729-4a1d-a811-a3bde399e22d",
+                "vf-module-type": "some-vf-module-type"
+              },
+              "vf-module-level-oper-status": {
+                "create-timestamp": "string",
+                "last-action": "CreateNetworkInstance",
+                "last-order-status": "Active",
+                "last-rpc-action": "assign",
+                "last-svc-request-id": "9c06a7c6-be3a-4530-bdd8-c65b58f123a5",
+                "modify-timestamp": "string",
+                "order-status": "Active"
+              },
+              "vf-module-request-input": {
+                "aic-clli": "string",
+                "aic-cloud-region": "test-region",
+                "cloud-owner": "unit-test",
+                "request-version": "string",
+                "tenant": "string",
+                "vf-module-input-parameters": {
+                  "param": [
+                    {
+                      "name": "string",
+                      "resource-resolution-data": {
+                        "capability-name": "string",
+                        "payload": "string",
+                        "resource-key": [
+                          {
+                            "name": "string",
+                            "value": "string"
+                          }
+                        ],
+                        "status": "string"
+                      },
+                      "value": "string"
+                    }
+                  ]
+                },
+                "vf-module-name": "string"
+              },
+              "vf-module-topology": {
+                "aic-clli": "string",
+                "aic-cloud-region": "test-region",
+                "cloud-owner": "unit-test",
+                "onap-model-information": {
+                  "model-customization-uuid": "602c6bcc-6cfa-41cb-a8a7-968b38d5935f",
+                  "model-invariant-uuid": "bdb4f943-c9be-4742-b976-a34607f3687e",
+                  "model-name": "SMSF-NC2-578",
+                  "model-uuid": "86c76b5d-fa8d-4034-b79a-1cc4326021a9",
+                  "model-version": "3.0"
+                },
+                "sdnc-generated-cloud-resources": true,
+                "tenant": "string",
+                "vf-module-assignments": {
+                  "dhcp-subnet-assignments": {
+                    "dhcp-subnet-assignment": [
+                      {
+                        "ip-version": "string",
+                        "network-role": "test-network-role",
+                        "neutron-subnet-id": "string"
+                      }
+                    ]
+                  },
+                  "vf-module-status": "string",
+                  "vlan-vnfc-instance-groups": {
+                    "vlan-vnfc-instance-group": [
+                      {
+                        "instance-group-function": "string",
+                        "instance-group-id": "string",
+                        "vnf-id": "2a3bfc93-cd4c-4845-8919-434b2d999ada",
+                        "vnfcs": {
+                          "vnfc": [
+                            {
+                              "vnfc-name": "string",
+                              "vnic-groups": {
+                                "vnic-group": [
+                                  {
+                                    "network-instance-group-function": "string",
+                                    "vlan-assignment-policy-name": "string",
+                                    "vlan-common-ip-addresses": {
+                                      "ip-addresses": {
+                                        "ipv4-address": "string",
+                                        "ipv6-address": "string",
+                                        "vipv4-address": "string",
+                                        "vipv6-address": "string"
+                                      }
+                                    },
+                                    "vlan-tag-index-next": 0,
+                                    "vlan-vnics": {
+                                      "vlan-vnic": [
+                                        {
+                                          "vnic-port-id": "string",
+                                          "vnic-sub-interfaces": {
+                                            "sub-interface-network-data": [
+                                              {
+                                                "floating-ips": {
+                                                  "floating-ip-v4": [
+                                                    "string"
+                                                  ],
+                                                  "floating-ip-v6": [
+                                                    "string"
+                                                  ]
+                                                },
+                                                "network-id": "69f09279-8af1-4475-83cf-7e357c579dbf",
+                                                "network-information-items": {
+                                                  "network-information-item": [
+                                                    {
+                                                      "ip-count": 0,
+                                                      "ip-version": "string",
+                                                      "network-ips": {
+                                                        "network-ip": [
+                                                          "string"
+                                                        ]
+                                                      },
+                                                      "use-dhcp": "Y"
+                                                    }
+                                                  ]
+                                                },
+                                                "network-name": 0,
+                                                "network-role": "test-network-role",
+                                                "network-role-tag": "string",
+                                                "neutron-network-id": "string",
+                                                "vlan-tag-id": 0
+                                              }
+                                            ]
+                                          }
+                                        }
+                                      ]
+                                    },
+                                    "vnic-interface-role": "string"
+                                  }
+                                ]
+                              }
+                            }
+                          ]
+                        }
+                      }
+                    ]
+                  },
+                  "vms": {
+                    "vm": [
+                      {
+                        "nfc-naming-code": "string",
+                        "onap-model-information": {
+                          "model-customization-uuid": "string",
+                          "model-invariant-uuid": "string",
+                          "model-name": "string",
+                          "model-uuid": "string",
+                          "model-version": "string"
+                        },
+                        "vm-count": 0,
+                        "vm-names": {
+                          "vm-name": [
+                            "string"
+                          ],
+                          "vnfc-names": [
+                            {
+                              "vnfc-name": "string",
+                              "vnfc-networks": {
+                                "vnfc-network-data": [
+                                  {
+                                    "connection-point": {
+                                      "connection-point-id": "string",
+                                      "port-id": "string",
+                                      "vlan-data": [
+                                        {
+                                          "vlan-role": "string",
+                                          "vlan-tag-description": "string",
+                                          "vlan-tag-id": "string",
+                                          "vlan-uuid": "string"
+                                        }
+                                      ]
+                                    },
+                                    "vnfc-network-role": "string",
+                                    "vnfc-ports": {
+                                      "vnfc-port": [
+                                        {
+                                          "common-sub-interface-role": "string",
+                                          "vnfc-port-id": "string",
+                                          "vnic-sub-interfaces": {
+                                            "sub-interface-network-data": [
+                                              {
+                                                "floating-ips": {
+                                                  "floating-ip-v4": [
+                                                    "string"
+                                                  ],
+                                                  "floating-ip-v6": [
+                                                    "string"
+                                                  ]
+                                                },
+                                                "network-id": "69f09279-8af1-4475-83cf-7e357c579dbf",
+                                                "network-information-items": {
+                                                  "network-information-item": [
+                                                    {
+                                                      "ip-count": 0,
+                                                      "ip-version": "string",
+                                                      "network-ips": {
+                                                        "network-ip": [
+                                                          "string"
+                                                        ]
+                                                      },
+                                                      "use-dhcp": "Y"
+                                                    }
+                                                  ]
+                                                },
+                                                "network-name": 0,
+                                                "network-role": "test-network-role",
+                                                "network-role-tag": "string",
+                                                "neutron-network-id": "string",
+                                                "vlan-tag-id": 0
+                                              }
+                                            ]
+                                          }
+                                        }
+                                      ]
+                                    },
+                                    "vnfc-subnet": [
+                                      {
+                                        "vnfc-ip-assignments": [
+                                          {
+                                            "vnfc-address-family": "ipv4",
+                                            "vnfc-subnet-dhcp": "Y",
+                                            "vnfc-subnet-ip": [
+                                              {
+                                                "ip-type": "FIXED",
+                                                "vnfc-client-key": "string",
+                                                "vnfc-ip-address": "string"
+                                              }
+                                            ],
+                                            "vnfc-subnet-ip-count": 0
+                                          }
+                                        ],
+                                        "vnfc-subnet-role": "string"
+                                      }
+                                    ],
+                                    "vnfc-type": "string"
+                                  }
+                                ]
+                              }
+                            }
+                          ]
+                        },
+                        "vm-networks": {
+                          "vm-network": [
+                            {
+                              "floating-ips": {
+                                "floating-ip-v4": [
+                                  "string"
+                                ],
+                                "floating-ip-v6": [
+                                  "string"
+                                ]
+                              },
+                              "interface-route-prefixes": {
+                                "interface-route-prefix": [
+                                  "string"
+                                ]
+                              },
+                              "is-trunked": true,
+                              "mac-addresses": {
+                                "mac-address": [
+                                  "string"
+                                ]
+                              },
+                              "network-information-items": {
+                                "network-information-item": [
+                                  {
+                                    "ip-count": 0,
+                                    "ip-version": "string",
+                                    "network-ips": {
+                                      "network-ip": [
+                                        "string"
+                                      ]
+                                    },
+                                    "use-dhcp": "Y"
+                                  }
+                                ]
+                              },
+                              "network-role": "test-network-role",
+                              "network-role-tag": "string",
+                              "related-networks": {
+                                "related-network": [
+                                  {
+                                    "network-id": "69f09279-8af1-4475-83cf-7e357c579dbf",
+                                    "network-role": "test-network-role",
+                                    "vlan-tags": {
+                                      "is-private": true,
+                                      "lower-tag-id": 0,
+                                      "upper-tag-id": 0,
+                                      "vlan-interface": "string"
+                                    }
+                                  }
+                                ]
+                              },
+                              "segmentation-id": "string",
+                              "sriov-parameters": {
+                                "application-tags": {
+                                  "c-tags": {
+                                    "c-tag": [
+                                      "string"
+                                    ],
+                                    "ctag": [
+                                      "string"
+                                    ]
+                                  },
+                                  "ctags": {
+                                    "c-tag": [
+                                      "string"
+                                    ],
+                                    "ctag": [
+                                      "string"
+                                    ]
+                                  },
+                                  "s-tags": {
+                                    "s-tag": [
+                                      "string"
+                                    ],
+                                    "stag": [
+                                      "string"
+                                    ]
+                                  },
+                                  "stags": {
+                                    "s-tag": [
+                                      "string"
+                                    ],
+                                    "stag": [
+                                      "string"
+                                    ]
+                                  }
+                                },
+                                "heat-vlan-filters": {
+                                  "heat-vlan-filter": [
+                                    "string"
+                                  ]
+                                }
+                              }
+                            }
+                          ]
+                        },
+                        "vm-type": "string",
+                        "vm-type-tag": "string"
+                      }
+                    ]
+                  }
+                },
+                "vf-module-parameters": {
+                  "param": [
+                    {
+                      "name": "string",
+                      "resource-resolution-data": {
+                        "capability-name": "string",
+                        "payload": "string",
+                        "resource-key": [
+                          {
+                            "name": "string",
+                            "value": "string"
+                          }
+                        ],
+                        "status": "string"
+                      },
+                      "value": "string"
+                    }
+                  ]
+                },
+                "vf-module-topology-identifier": {
+                  "vf-module-id": "45841173-3729-4a1d-a811-a3bde399e22d",
+                  "vf-module-name": "some-vf-module-name",
+                  "vf-module-type": "some-vf-module-type"
+                }
+              },
+              "vnf-information": {
+                "onap-model-information": {
+                  "model-customization-uuid": "602c6bcc-6cfa-41cb-a8a7-968b38d5935f",
+                  "model-invariant-uuid": "bdb4f943-c9be-4742-b976-a34607f3687e",
+                  "model-name": "SMSF-NC2-578",
+                  "model-uuid": "86c76b5d-fa8d-4034-b79a-1cc4326021a9",
+                  "model-version": "3.0"
+                },
+                "vnf-id": "fae319cc-68d6-496f-be1e-a09e133c71d4",
+                "vnf-name": "mytestvnf",
+                "vnf-type": "SMSF-NC2-578-SVC/SMSF-NC2-578"
+              }
+            },
+            "vf-module-id": "45841173-3729-4a1d-a811-a3bde399e22d"
+          }
+        ]
+      },
+      "vnf-information": {
+        "onap-model-information": {
+          "model-customization-uuid": "602c6bcc-6cfa-41cb-a8a7-968b38d5935f",
+          "model-invariant-uuid": "bdb4f943-c9be-4742-b976-a34607f3687e",
+          "model-name": "SMSF-NC2-578",
+          "model-uuid": "86c76b5d-fa8d-4034-b79a-1cc4326021a9",
+          "model-version": "3.0"
+        },
+        "vnf-id": "fae319cc-68d6-496f-be1e-a09e133c71d4",
+        "vnf-name": "mytestvnf",
+        "vnf-type": "SMSF-NC2-578-SVC/SMSF-NC2-578"
+      },
+      "vnf-level-oper-status": {
+        "create-timestamp": "string",
+        "last-action": "CreateNetworkInstance",
+        "last-order-status": "Active",
+        "last-rpc-action": "assign",
+        "last-svc-request-id": "9c06a7c6-be3a-4530-bdd8-c65b58f123a5",
+        "modify-timestamp": "string",
+        "order-status": "Active"
+      },
+      "vnf-request-input": {
+        "aic-clli": "string",
+        "aic-cloud-region": "test-region",
+        "cloud-owner": "unit-test",
+        "request-version": "string",
+        "tenant": "string",
+        "vnf-name": "mytestvnf",
+        "vnf-networks": {
+          "vnf-network": [
+            {
+              "contrail-network-fqdn": "string",
+              "is-trunked": true,
+              "network-id": "69f09279-8af1-4475-83cf-7e357c579dbf",
+              "network-name": "test-network-name",
+              "network-role": "test-network-role",
+              "neutron-id": "812562dd-9d91-4ba6-9c3e-e52bf1cd4cc6",
+              "related-networks": {
+                "related-network": [
+                  {
+                    "network-id": "69f09279-8af1-4475-83cf-7e357c579dbf",
+                    "network-role": "test-network-role",
+                    "vlan-tags": {
+                      "is-private": true,
+                      "lower-tag-id": 0,
+                      "upper-tag-id": 0,
+                      "vlan-interface": "string"
+                    }
+                  }
+                ]
+              },
+              "segmentation-id": "string",
+              "subnets-data": {
+                "subnet-data": [
+                  {
+                    "cidr-mask": "string",
+                    "dhcp-enabled": "Y",
+                    "gateway-address": "string",
+                    "ip-version": "string",
+                    "network-start-address": "string",
+                    "sdnc-subnet-id": "string",
+                    "subnet-id": "string",
+                    "subnet-name": "string",
+                    "subnet-role": "string"
+                  }
+                ]
+              }
+            }
+          ]
+        }
+      },
+      "vnf-topology": {
+        "aic-clli": "string",
+        "aic-cloud-region": "test-region",
+        "cloud-owner": "unit-test",
+        "onap-model-information": {
+          "model-customization-uuid": "602c6bcc-6cfa-41cb-a8a7-968b38d5935f",
+          "model-invariant-uuid": "bdb4f943-c9be-4742-b976-a34607f3687e",
+          "model-name": "SMSF-NC2-578",
+          "model-uuid": "86c76b5d-fa8d-4034-b79a-1cc4326021a9",
+          "model-version": "3.0"
+        },
+        "sdnc-generated-cloud-resources": true,
+        "tenant": "string",
+        "vnf-resource-assignments": {
+          "availability-zones": {
+            "availability-zone": [
+              "string"
+            ],
+            "max-count": 0
+          },
+          "vnf-networks": {
+            "vnf-network": [
+              {
+                "contrail-network-fqdn": "string",
+                "is-trunked": true,
+                "network-id": "69f09279-8af1-4475-83cf-7e357c579dbf",
+                "network-name": "test-network-name",
+                "network-role": "test-network-role",
+                "neutron-id": "812562dd-9d91-4ba6-9c3e-e52bf1cd4cc6",
+                "related-networks": {
+                  "related-network": [
+                    {
+                      "network-id": "69f09279-8af1-4475-83cf-7e357c579dbf",
+                      "network-role": "test-network-role",
+                      "vlan-tags": {
+                        "is-private": true,
+                        "lower-tag-id": 0,
+                        "upper-tag-id": 0,
+                        "vlan-interface": "string"
+                      }
+                    }
+                  ]
+                },
+                "segmentation-id": "string",
+                "subnets-data": {
+                  "subnet-data": [
+                    {
+                      "cidr-mask": "string",
+                      "dhcp-enabled": "Y",
+                      "gateway-address": "string",
+                      "ip-version": "string",
+                      "network-start-address": "string",
+                      "sdnc-subnet-id": "string",
+                      "subnet-id": "string",
+                      "subnet-name": "string",
+                      "subnet-role": "string"
+                    }
+                  ]
+                }
+              }
+            ]
+          },
+          "vnf-status": "string"
+        },
+        "vnf-topology-identifier-structure": {
+          "nf-code": "string",
+          "nf-function": "string",
+          "nf-role": "string",
+          "nf-type": "string",
+          "vnf-id": "fae319cc-68d6-496f-be1e-a09e133c71d4",
+          "vnf-name": "mytestvnf",
+          "vnf-type": "SMSF-NC2-578-SVC/SMSF-NC2-578"
+        }
+      }
+    },
+    "vnf-id": "fae319cc-68d6-496f-be1e-a09e133c71d4"
+  }
+}
\ No newline at end of file
diff --git a/ms/gra/gra-docker/README.md b/ms/gra/gra-docker/README.md
new file mode 100644 (file)
index 0000000..bfc1140
--- /dev/null
@@ -0,0 +1,69 @@
+# generic-resource-api docker
+This creates the internal AT&T docker for the generic resource api microservice.
+
+## Prerequisites for doing local build
+Before doing local builds, you'll need to do the following one-time setup steps:
+
+1. Install docker and docker-compose
+1. Make sure your id is in the 'docker' user group so that you can run docker commands.
+1. Start a local docker registry by running `sudo docker run -d -p 5000:5000 --restart=always --name registry registry:2`
+1. Login to dockercentral with your attuid/itservices password by running `docker login dockecentral.it.att.com:5100`
+
+## Creating a local build
+To do a local build, run this command:
+    mvn clean package -Ddocker.push.registry=localhost:5000 -Ddocker.buildArg.http_proxy=$http_proxy -Ddocker.buildArg.https_proxy=$https_proxy -Ddocker.buildArg.no_proxy=$no_proxy
+
+## Environment variables
+The generic-resource-api ms expects the following environment variables to be set:
+### MySQL Credentuals
+* MYSQL_ROOT_PASSWORD
+* MYSQL_USER
+* MYSQL_PASSWORD
+* MYSQL_DATABASE
+### OpenDaylight controller credentials
+* ODL_USER
+* ODL_PASSWORD
+### DMAAP message router credentials
+* DMAAP_USER
+* DMAAP_PASSWORD
+* DMAAP_AUTHKEY
+### AAI credentials
+* AAI_TRUSTSTORE_PASSWORD
+* AAI_CLIENT_NAME
+* AAI_CLIENT_PASSWORD
+### Ansible credentials
+* ANSIBLE_TRUSTSTORE_PASSWORD
+* ANSIBLE_USER
+* ANSIBLE_PASSWORD
+### Honeycomb credentials
+* HONEYCOMB_USER
+* HONEYCOMB_PASSWORD
+### SSL/TLS truststore/keystore credentials
+* TRUSTSTORE_PASSWORD
+* KEYSTORE_PASSWORD
+* CACERT_PASSWORD
+* SDNC_KEYSTORE_PASSWORD
+### Naming microservice credentials
+* NENG_USER
+* NENG_PASSWORD
+### SO credentials
+* SO_USER
+* SO_PASSWORD
+### CDS credentials
+* CDS_USER
+* CDS_PASSWORD
+### Sql encryption key
+export SQL_CRYPTKEY=QtfJMKggVk
+### ASDC credentials
+* ASDC_USER
+* ASDC_PASSWORD
+### AAF IP address (only needed by docker-compose.yml - does not need to be set in helm chart)
+* AAF_IP_ADDRESS
+
+## Running local copy
+To start a local copy of the generic-resource-api:
+1. cd to src/main/dc
+1. run `docker-compose up -d`
+1. To view logs, run `docker-compose logs -f`
+
+
index 4bb725c..6af3413 100644 (file)
     <url>http://wiki.onap.org</url>
 
     <properties>
+        <image.build.properties.file>/image.build.properties</image.build.properties.file>
+        <chart.update.properties.file>/chart.update.properties</chart.update.properties.file>
         <base.image.name>onap/ccsdk-alpine-j11-image</base.image.name>
-        <image.name>onap/sdnc-gra-image</image.name>
+        <base.image.version>${ccsdk.docker.version}</base.image.version>
+        <platform.logic.group>org.onap.ccsdk.distribution</platform.logic.group>
+        <platform.logic.version>${ccsdk.distribution.version}</platform.logic.version>
+        <image.name>onap/sdnc-gra</image.name>
         <ccsdk.project.version>${project.version}</ccsdk.project.version>
         <ccsdk.build.timestamp>${maven.build.timestamp}</ccsdk.build.timestamp>
         <maven.build.timestamp.format>yyyyMMdd'T'HHmmss'Z'</maven.build.timestamp.format>
         <sdnc.gra.jar>gra-app-${project.version}.jar</sdnc.gra.jar>
-        <onap.truststore>truststoreONAPall.jks</onap.truststore>
+        <sdnc.uid>1001</sdnc.uid>
+        <truststore.file>truststore.jks</truststore.file>
         <docker.push.phase>deploy</docker.push.phase>
+        <docker.push.retries>5</docker.push.retries>
         <docker.autoCreateCustomNetworks>true</docker.autoCreateCustomNetworks>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+        <db.image.name>mariadb</db.image.name>
+        <db.image.version>10.5</db.image.version>
     </properties>
 
     <dependencies>
             <artifactId>gra-app</artifactId>
             <version>${project.version}</version>
         </dependency>
+        <dependency>
+            <groupId>com.microsoft.azure</groupId>
+            <artifactId>applicationinsights-agent</artifactId>
+            <version>3.2.0</version>
+        </dependency>
+        <dependency>
+            <groupId>${platform.logic.group}</groupId>
+            <artifactId>platform-logic-installer</artifactId>
+            <version>${platform.logic.version}</version>
+            <type>zip</type>
+        </dependency>
     </dependencies>
 
 
                         <artifactId>gmaven-plugin</artifactId>
                         <executions>
                             <execution>
-                                <phase>validate</phase>
+                                <phase>prepare-package</phase>
                                 <goals>
                                     <goal>execute</goal>
                                 </goals>
                                 <configuration>
+                                    <source>
+                                        println 'repository: ' + project.properties['image.name'];
+                                        println 'tag: ' + project.version + '-' + project.properties['build.number'];
+                                        String dir = project.parent.build.directory;
+                                        println dir;
+                                        File mkDir = new File(dir);
+                                        File chartUpdateFile = new File(dir.concat(project.properties['chart.update.properties.file']));
+                                        mkDir.mkdirs();
+                                        dir = dir.concat(project.properties['image.build.properties.file']);
+                                        println dir;
+                                        File propFile = new File(dir);
+                                        propFile.createNewFile();
+                                        chartUpdateFile.createNewFile();
+                                        propFile.append('repository: ' + project.properties['image.name'] + '\n');
+                                        propFile.append('tag: ' + project.version + '-' + project.properties['build.number'] + '\n');
+                                        chartUpdateFile.append(' --set global.gra.image.tag=' + project.version + '-' + project.properties['build.number']);
+                                    </source>
                                     <source>${basedir}/../../../TagVersion.groovy</source>
                                 </configuration>
                             </execution>
                         <groupId>org.apache.maven.plugins</groupId>
                         <artifactId>maven-dependency-plugin</artifactId>
                         <version>2.10</version>
-
                         <executions>
                             <execution>
                                 <id>copy-dependencies</id>
                                 <phase>process-resources</phase>
                                 <configuration>
                                     <excludeTransitive>true</excludeTransitive>
-                                    <outputDirectory>${project.build.directory}/docker-stage/opt/onap/sdnc/lib</outputDirectory>
+                                    <outputDirectory>${project.build.directory}/docker-stage/opt/sdnc/gra/lib</outputDirectory>
                                     <overWriteReleases>false</overWriteReleases>
                                     <overWriteSnapshots>true</overWriteSnapshots>
                                     <overWriteIfNewer>true</overWriteIfNewer>
                                 <id>unpack dgs</id>
                                 <phase>generate-sources</phase>
                                 <goals>
-                                    <goal>unpack</goal>
+                                    <goal>unpack-dependencies</goal>
                                 </goals>
                                 <configuration>
-                                    <outputDirectory>${basedir}/target/docker-stage/opt/onap/sdnc</outputDirectory>
-                                    <artifactItems>
-                                        <artifactItem>
-                                            <groupId>org.onap.sdnc.oam</groupId>
-                                            <artifactId>platform-logic-installer</artifactId>
-                                            <version>${sdnc.oam.version}</version>
-                                            <type>zip</type>
-                                        </artifactItem>
-                                    </artifactItems>
+                                    <outputDirectory>${basedir}/target/docker-stage/opt/sdnc/gra</outputDirectory>
+                                    <includeArtifactIds>platform-logic-installer</includeArtifactIds>
                                 </configuration>
                             </execution>
                         </executions>
                                 </goals> <!-- here the phase you need -->
                                 <phase>generate-resources</phase>
                                 <configuration>
-                                    <outputDirectory>${basedir}/target/docker-stage/opt/onap/sdnc/config</outputDirectory>
+                                    <outputDirectory>${basedir}/target/docker-stage/opt/sdnc/gra/config</outputDirectory>
                                     <resources>
                                         <resource>
                                             <directory>src/main/resources</directory>
                                 </goals> <!-- here the phase you need -->
                                 <phase>generate-resources</phase>
                                 <configuration>
-                                    <outputDirectory>${basedir}/target/docker-stage/opt/onap/sdnc/config</outputDirectory>
+                                    <outputDirectory>${basedir}/target/docker-stage/opt/sdnc/gra/config</outputDirectory>
                                     <resources>
                                         <resource>
                                             <directory>src/main/resources</directory>
                                 </goals> <!-- here the phase you need -->
                                 <phase>generate-resources</phase>
                                 <configuration>
-                                    <outputDirectory>${basedir}/target/docker-stage/opt/onap/sdnc/bin</outputDirectory>
+                                    <outputDirectory>${basedir}/target/docker-stage/opt/sdnc/gra/bin</outputDirectory>
                                     <resources>
                                         <resource>
                                             <directory>src/main/resources</directory>
                                             </includes>
                                             <filtering>true</filtering>
                                         </resource>
+                                        <resource>
+                                            <directory>src/main/scripts</directory>
+                                            <includes>
+                                                <include>exportGraDaexim.sh</include>
+                                                <include>importGraDaexim.sh</include>
+                                            </includes>
+                                        </resource>
+                                    </resources>
+                                </configuration>
+                            </execution>
+                            <execution>
+                                <id>copy-restapi-templates</id>
+                                <goals>
+                                    <goal>copy-resources</goal>
+                                </goals> <!-- here the phase you need -->
+                                <phase>generate-resources</phase>
+                                <configuration>
+                                    <outputDirectory>${basedir}/target/docker-stage/opt/sdnc/gra/restapi/templates</outputDirectory>
+                                    <resources>
+                                        <resource>
+                                            <directory>src/main/templates</directory>
+                                            <includes>
+                                                <include>*.json</include>
+                                            </includes>
+                                            <filtering>false</filtering>
+                                        </resource>
                                     </resources>
                                 </configuration>
                             </execution>
                     <plugin>
                         <groupId>io.fabric8</groupId>
                         <artifactId>docker-maven-plugin</artifactId>
-                        <version>0.28.0</version>
+                        <version>0.34.0</version>
                         <inherited>false</inherited>
                         <configuration>
                             <images>
                                     <name>${image.name}</name>
                                     <build>
                                         <cleanup>try</cleanup>
-                                        <dockerFileDir>${basedir}/target/docker-stage</dockerFileDir>
+                                        <noCache>true</noCache>
+                                        <contextDir>${basedir}/target/docker-stage</contextDir>
                                         <dockerFile>Dockerfile</dockerFile>
                                         <tags>
                                             <tag>${project.docker.latestminortag.version}</tag>
                                             <tag>${project.docker.latestfulltag.version}</tag>
-                                            <tag>${project.docker.latesttagtimestamp.version}</tag>
                                         </tags>
                                     </build>
+                                    <external>
+                                        <type>properties</type>
+                                        <prefix>docker</prefix>
+                                        <mode>override</mode>
+                                    </external>
                                 </image>
                             </images>
+                            <verbose>true</verbose>
                         </configuration>
                         <executions>
                             <execution>
                                 <configuration>
                                     <images>
                                         <image>
-                                            <name>mariadb:10.5</name>
+                                            <name>${db.image.name}:${db.image.version}</name>
                                             <alias>gradb</alias>
                                             <run>
                                                 <env>
                                             </run>
                                         </image>
                                         <image>
-                                            <name>${image.name}:${project.docker.latesttagtimestamp.version}</name>
+                                            <name>${image.name}:${project.docker.latestfulltag.version}</name>
                                             <alias>gra-container</alias>
                                             <run>
                                                 <env>
                                                     <MYSQL_PASSWORD>${gratest.mysql.password}</MYSQL_PASSWORD>
                                                     <MYSQL_DATABASE>${gratest.mysql.database}</MYSQL_DATABASE>
                                                     <LOG_LEVEL>INFO</LOG_LEVEL>
-                                                    <SDNC_CONFIG_DIR>/opt/onap/sdnc/config</SDNC_CONFIG_DIR>
+                                                    <SDNC_CONFIG_DIR>/opt/sdnc/gra/config</SDNC_CONFIG_DIR>
                                                 </env>
                                                 <dependsOn>
                                                     <container>gradb</container>
index 4b0bd46..682655e 100644 (file)
@@ -12,15 +12,15 @@ services:
       - MYSQL_USER=${MYSQL_USER}
       - MYSQL_PASSWORD=${MYSQL_PASSWORD}
       - MYSQL_DATABASE=${MYSQL_DATABASE}
-    logging:       
+    logging:
       driver:   "json-file"
-      options:  
+      options:
         max-size: "30m"
         max-file: "5"
-  
-      
+
+
   gra:
-    image: onap/sdnc-gra-image:latest
+    image: onap/sdnc-gra:latest
     depends_on:
       - db
     container_name: gra_controller
@@ -28,10 +28,10 @@ services:
       - "8181:8080"
       - "8443:8443"
     volumes:
-      - ../resources/application.properties:/opt/onap/sdnc/config/application.properties 
-      - ../resources/cadi-example.properties:/opt/onap/sdnc/config/cadi.properties 
-      - ../resources/cadi-log.properties:/opt/onap/sdnc/config/cadi-log.properties 
-      - ../resources/cadi.keyfile:/opt/onap/sdnc/config/cadi.keyfile
+      - ../resources/application.properties:/opt/sdnc/gra/config/application.properties
+     # Uncomment line below to authenticate with AAF
+     # - ../resources/cadi-example.properties:/opt/sdnc/gra/config/cadi.properties
+      - ../resources/cadi-log.properties:/opt/sdnc/gra/config/cadi-log.properties
     links:
       - db:dbhost
     environment:
@@ -40,16 +40,21 @@ services:
       - MYSQL_USER=${MYSQL_USER}
       - MYSQL_PASSWORD=${MYSQL_PASSWORD}
       - MYSQL_DATABASE=${MYSQL_DATABASE}
-      - SDNC_CONFIG_DIR=/opt/onap/sdnc/config
+      - ODL_USER=${ODL_USER}
+      - AAF_MECHID_CRED=${ODL_PASSWORD}
+      - ODL_URI=http://localhost:8080
+      - SDNC_CONFIG_DIR=/opt/sdnc/gra/config
       - LOG_LEVEL=DEBUG
       - TRUSTSTORE_PASSWORD=changeit
       - CACERT_PASSWORD=changeit
-      - SDNC_CERT_DIR=/opt/onap/sdnc/config
+      - SDNC_CERT_DIR=/opt/sdnc/gra/config
       - JAVA_SECURITY_DIR=/usr/lib/jvm/default-jvm/jre/lib/security
       - TRUSTSTORE=truststoreONAPall.jks
-    logging:       
+      - SDNNFT_HOST=${SDNNFT_HOST:-localhost}
+      - LOG_PATH=/opt/sdnc/gra/logs
+    logging:
       driver:   "json-file"
-      options:  
+      options:
         max-size: "30m"
         max-file: "5"
     extra_hosts:
@@ -67,7 +72,7 @@ services:
     ports:
       - "3200:3100"
     volumes:
-      - ${HOME}/gerrit/sdnc/oam/platform-logic:/opt/onap/ccsdk/platform-logic
+      - ${HOME}/st_sdncp/platform-logic:/opt/onap/ccsdk/platform-logic
     links:
       - db:dbhost
       - db:sdnctldb01
@@ -78,8 +83,8 @@ services:
       - MYSQL_USER=${MYSQL_USER}
       - MYSQL_PASSWORD=${MYSQL_PASSWORD}
       - MYSQL_DATABASE=${MYSQL_DATABASE}
-    logging:       
+    logging:
       driver:   "json-file"
-      options:  
+      options:
         max-size: "30m"
         max-file: "5"
index 37c2ee6..54e8c1a 100644 (file)
@@ -1,44 +1,49 @@
 # Prepare stage for multistage image build
 ## START OF STAGE0 ##
-FROM @base.image.name@:@ccsdk.docker.version@ AS stage0
+FROM @base.image.name@:@base.image.version@ AS stage0
 
 ENV LOG_PATH /var/log/onap/sdnc
-ENV SDNC_CONFIG_DIR /opt/onap/sdnc/config
-ENV TRUSTSTORE @onap.truststore@
+ENV SDNC_CONFIG_DIR /opt/sdnc/gra/config
+ENV TRUSTSTORE @truststore.file@
 ENV JAVA_SECURITY_DIR /opt/java/openjdk/lib/security
 USER root
 
 # copy deliverables to opt
 COPY opt /opt
 
-# Install ONAP certificates
+# Install  certificates
 RUN keytool -importkeystore -srckeystore ${SDNC_CONFIG_DIR}/${TRUSTSTORE} -srcstorepass changeit -destkeystore ${JAVA_SECURITY_DIR}/cacerts -deststorepass changeit -noprompt
 
 ## END OF STAGE0 ##
 
 
-FROM @base.image.name@:@ccsdk.docker.version@
+FROM @base.image.name@:@base.image.version@
 
 MAINTAINER SDNC Team (onap-sdnc@lists.onap.org)
 
 ENV PROJECT_VERSION @project.version@
-ENV SDNC_HOME /opt/onap/sdnc
-ENV SDNC_CONFIG_DIR /opt/onap/sdnc/config
+ENV SDNC_HOME /opt/sdnc/gra
+ENV SDNC_CONFIG_DIR /opt/sdnc/gra/config
 ENV GRA_JAR @sdnc.gra.jar@
-ENV SVCLOGIC_PROPERTIES /opt/onap/sdnc/config/svclogic.properties
-ENV SVCLOGIC_DIR /opt/onap/sdnc/svclogic/graphs
+ENV SDNC_UID @sdnc.uid@
+ENV SVCLOGIC_PROPERTIES /opt/sdnc/gra/config/svclogic.properties
+ENV SVCLOGIC_DIR /opt/sdnc/gra/service-logic/graphs
 ENV LOG_PATH /var/log/onap/sdnc
 
 USER root
 
-# Install sudo and IP utilities
-RUN apk update && apk --no-cache add sudo iputils openssl
+# Install sudo,  IP utilities and openjdk 11
+RUN export http_proxy=http://sub.proxy.att.com:8080 \
+ && export https_proxy=http://sub.proxy.att.com:8080 \
+ && apk update && apk --no-cache add bash curl mysql-client sudo iputils openssl \
+ && unset http_proxy \
+ && unset https_proxy
 
 # Enable wheel group
 RUN sed -e 's/# %wheel ALL=(ALL) NOPASSWD: ALL/%wheel ALL=(ALL) NOPASSWD: ALL/g' -i /etc/sudoers
 
 # Create sdnc user
-RUN addgroup -S sdnc && adduser -S sdnc -G sdnc
+RUN addgroup -g ${SDNC_UID} -S sdnc && adduser -u ${SDNC_UID} -G sdnc -S sdnc
 RUN addgroup sdnc wheel
 
 COPY --from=stage0 --chown=sdnc:sdnc /opt /opt
@@ -48,5 +53,6 @@ RUN chmod +x ${SDNC_HOME}/bin/*.sh
 
 USER sdnc
 WORKDIR ${SDNC_HOME}
-ENTRYPOINT /opt/onap/sdnc/bin/startGra.sh
+ENTRYPOINT /opt/sdnc/gra/bin/startGra.sh
 EXPOSE 8443 8080
+
index 3feb604..30f5077 100644 (file)
@@ -23,3 +23,6 @@ spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.Ph
 
 spring.jpa.database=mysql
 cadi.properties.path=${SDNC_CONFIG_DIR}/cadi.properties
+swagger-ui.host=${SDNNFT_HOST:localhost}
+swagger-ui.title=SDN-NFT: GRA microservice
+swagger-ui.description=SDN-NFT GRA microservice API documentation
diff --git a/ms/gra/gra-docker/src/main/resources/contrail-adaptor.properties b/ms/gra/gra-docker/src/main/resources/contrail-adaptor.properties
new file mode 100644 (file)
index 0000000..c6d98f4
--- /dev/null
@@ -0,0 +1,40 @@
+keystone.username=admin
+keystone.password=admin
+tenant.password=admin
+contrail.template.dir=/opt/lsc/restapi/templates
+max.retry.count=3
+retry.wait=5000
+request.timeout=10000
+
+simulateResponse=false
+keystone.dummy.cache=true
+orm.dummy.cache=true
+use.orm=true
+
+cloud.config.use=false
+cloud.config.filename=cloud_config.json
+cloud.config.refresh.timer=1000
+
+#orm.default_keystone_url_version=/v3
+orm.default_keystone_url_version=/v2.0
+orm.default_keystone_version_regex=/[vV][0-9]
+orm.default_orm_url_replace_this=8080
+orm.default_orm_url_replace_with_this=7080
+orm.aic.client=ECOMP-SDNCP
+contrail.url.regex=sdn-l-config
+
+#properties need to create json for policymanager configBody
+configBody.service:NetworkPolicy
+configBody.version:1.3.0.1
+configBody.configName:Search
+configBody.policyScope:SDNC
+configBody.templateVersion:1607
+configBody.location:Search
+configBody.uuid:Search
+configBody.priority:2
+configBody.riskType:low
+configBody.riskLevel:2
+configBody.guard:True
+
+aic.contrail.proxy=none
+aic.keystone.proxy=none
diff --git a/ms/gra/gra-docker/src/main/resources/contrail-api-path.properties b/ms/gra/gra-docker/src/main/resources/contrail-api-path.properties
new file mode 100644 (file)
index 0000000..4c04d0e
--- /dev/null
@@ -0,0 +1,59 @@
+network-policy.create.path=/network-policys
+network-policy.create.method=NetworkPolicy.createNetworkPolicy
+network-policy.create.hasTemplateFile=Y
+
+network-policy.get.path=/network-policy/{contrail-network-policy-id}
+network-policy.get.method=NetworkPolicy.getNetworkPolicy
+network-policy.get.hasTemplateFile=N
+
+network-policy.delete.path=/network-policy/{contrail-network-policy-id}
+network-policy.delete.method=NetworkPolicy.deleteNetworkPolicy
+network-policy.delete.hasTemplateFile=N
+
+network-policy.update.path=/network-policy/{contrail-network-policy-id}
+network-policy.update.method=NetworkPolicy.updateNetworkPolicy
+network-policy.update.hasTemplateFile=Y
+
+network-policy.apply.path=/virtual-network/{contrail-virtual-network-id}
+network-policy.apply.method=NetworkPolicy.applyNetworkPolicy
+network-policy.apply.hasTemplateFile=N
+
+network-policy.remove.path=/virtual-network/{contrail-virtual-network-id}
+network-policy.remove.method=NetworkPolicy.removeNetworkPolicy
+network-policy.remove.hasTemplateFile=N
+
+virtual-networks.get.path=/virtual-networks
+virtual-networks.get.method=NetworkPolicy.getVirtualNetworks
+virtual-networks.get.hasTemplateFile=N
+
+virtual-network.get.path=/virtual-network/{contrail-virtual-network-id}
+virtual-network.get.method=NetworkPolicy.getVirtualNetwork
+virtual-network.get.hasTemplateFile=N
+
+fqname-to-uuid.get.path=/fqname-to-id
+fqname-to-uuid.get.method=NetworkPolicy.getFqNameToUuid
+fqname-to-uuid.get.hasTemplateFile=Y
+
+id-to-fqname.get.path=/id-to-fqname
+id-to-fqname.get.method=NetworkPolicy.getIdToFqName
+id-to-fqname.get.hasTemplateFile=N
+
+virtual-machine-interface.get.path=/virtual-machine-interface/{contrail-virtual-machine-interface-id}
+virtual-machine-interface.get.method=PortMirroring.getVirtualMachineInterface
+virtual-machine-interface.get.hasTemplateFile=N
+
+port-mirroring.enable.path=/virtual-machine-interface/{contrail-virtual-machine-interface-id}
+port-mirroring.enable.method=PortMirroring.enablePortMirroring
+port-mirroring.enable.hasTemplateFile=Y
+
+port-mirroring.disable.path=/virtual-machine-interface/{contrail-virtual-machine-interface-id}
+port-mirroring.disable.method=PortMirroring.disablePortMirroring
+port-mirroring.disable.hasTemplateFile=Y
+
+subnet.add.path=/virtual-network/{contrail-virtual-network-id}
+subnet.add.method=NetworkPolicy.addSubnet
+subnet.add.hasTemplateFile=N
+
+subnet.delete.path=/virtual-network/{contrail-virtual-network-id}
+subnet.delete.method=NetworkPolicy.deleteSubnet
+subnet.delete.hasTemplateFile=N
diff --git a/ms/gra/gra-docker/src/main/resources/eipam.properties b/ms/gra/gra-docker/src/main/resources/eipam.properties
new file mode 100644 (file)
index 0000000..22052fe
--- /dev/null
@@ -0,0 +1,63 @@
+eipam.templateDir=/opt/sdnc/gra/restapi/templates/
+
+#mS is new in 1810, URL is driven by DME2
+eipam.service=microservice-router.lpp.att.com/services/microservice_router/v1/routes
+
+#DME proxy does not work in containers(1908), workaround is to call alternate.url
+# 1906/1908 Can be Direct call or LGW to replace DME2
+#1906 Direct call
+#eipam.alternate.url=https://st3-lppajsc.oss.att.com:8666/services/microservice_router/v1/routes
+#1908 LGW to replace DME2
+#eipam.alternate.url=https://eipam1-ipaddress.dev.att.com
+#eipam.rest.urlEndPoint=/eipam/rest/ipassignment/
+eipam.alternate.url=https://eipam-ipaddress1.stage.att.com
+
+# subContext for Direct Call, if used the LGW subContext below need to be commented out
+#eipam.subContext.assign=/eipamIP/assign
+#eipam.subContext.unassign=/eipamIP/unassign
+#eipam.subContext.createPool=/eipamIP/createPool
+#eipam.subContext.deletePool=/eipamIP/deletePool
+#eipam.subContext.getPlanTopology=/eipamIP/topology
+#eipam.subContext.getIPAddress=/eipamIP/getIP
+#eipam.subContext.allocateSubnet=/eipamIP/allocate
+#eipam.subContext.deallocateSubnet=/eipamIP/deallocate
+#eipam.subContext.activateSubnet=/eipamIP/activateSubnet
+#eipam.subContext.ping=/eipamIP/ping
+#eipam.subContext.getPool=/eipamIP/getPool
+#eipam.subContext.examineIP=/eipamIP/examineIP
+
+eipam.httpMethod.assign=PUT
+eipam.httpMethod.unassign=POST
+eipam.httpMethod.createPool=PUT
+eipam.httpMethod.deletePool=POST
+eipam.httpMethod.getPlanTopology=GET
+eipam.httpMethod.getIPAddress=GET
+eipam.httpMethod.allocateSubnet=PUT
+eipam.httpMethod.deallocateSubnet=PUT
+eipam.httpMethod.activateSubnet=PUT
+eipam.httpMethod.ping=GET
+eipam.httpMethod.getPool=POST
+eipam.httpMethod.examineIP=POST
+
+# subContext for LGW, if used the above Direct Call subContext need to be commented out
+eipam.subContext.assign=/eipam/restservices/v1/ipaddress/assign
+eipam.subContext.unassign=/eipam/restservices/v1/ipaddress/unassign
+eipam.subContext.createPool=/eipam/restservices/v1/ipaddress/pool
+eipam.subContext.deletePool=/eipam/restservices/v1/ipaddress/pool/remove
+eipam.subContext.getPlanTopology=/eipam/restservices/v1/ipaddress/plantopology
+eipam.subContext.getIPAddress=/eipam/restservices/v1/ipaddress
+eipam.subContext.allocateSubnet=/eipam/restservices/v1/ipaddress/subnet/allocate
+eipam.subContext.deallocateSubnet=/eipam/restservices/v1/ipaddress/subnet/deallocate
+eipam.subContext.activateSubnet=/eipam/restservices/v1/ipaddress/subnet/activate
+eipam.subContext.ping=/eipam/restservices/v1/ipaddress/ping
+eipam.subContext.getPool=/eipam/restservices/v1/ipaddress/pool
+eipam.subContext.examineIP=/eipam/restservices/v1/ipaddress/examineIPAddressInfo
+
+eipam.connectionTimeout=30000
+eipam.receiveTimeout=60000
+#eipam.version=0.1
+#eipam.envContext=TEST
+#eipam.routeOffer=ST3
+eipam.client=sdn_cp_ws
+eipam.msgid=sdn
+eipam.wss.user=sdn_cp_ws
index 3751142..908c32b 100644 (file)
@@ -1,7 +1,44 @@
-restapi.templateDir=/opt/onap/sdnc/restapi/templates
+restapi.templateDir=/opt/sdnc/gra/restapi/templates
 controller.url=http://localhost:8080
 controller.user=${ODL_USER}
 controller.pwd=${ODL_PASSWORD}
+bondingservice.server=${ADMIN_PORTAL_URL}
+bondingservice.user=${ODL_USER}
+bondingservice.password=${ODL_PASSWORD}
+bondingservice.authorization=${BONDING_SERVICE_CRED}
+bondingservice.uri=/provisioningms/v1/bondingservice/{action}
+cloud-region.cloud-owner=att-aic
+policy-manager.url=${POLICY_MANAGER_URL}
+policy-manager.authorization=${POLICY_AUTHORIZATION_CRED}
+policy-manager.clientauth=${POLICY_CLIENTAUTH_CRED}
+policy-manager.environment=TEST
+# MICROSERVICE
+rt.mS.user=${ODL_USER}
+rt.mS.pwd=${ODL_PASSWORD}
+rt.mS.routeTarget.type=dme2proxy
+rt.mS.routeTarget.service=microservice-router.lpp.att.com/services/microservice_router/v1/routes
+rt.ms.allocateRouteTarget.subContext=/nwrouting/allocateroutetarget/
+rt.ms.releaseRouteTarget.subContext=/nwrouting/releaseroutetarget/
+rt.ms.routeTarget.version=0.1
+rt.ms.routeTarget.envContext=TEST
+rt.ms.routeTarget.routeOffer=ST3
+rt.ms.routeTarget.appId=SDNCP
+# VLAN-TAG MICROSERVICE
+vt.mS.url=${ADMIN_PORTAL_URL}
+vt.mS.user=${ODL_USER}
+vt.mS.pwd=${ODL_PASSWORD}
+# MAC Address MICROSERVICE
+ma.mS.url=${ADMIN_PORTAL_URL}
+ma.mS.user=${ODL_USER}
+ma.mS.pwd=${ODL_PASSWORD}
+# CDS ipassign mS
+ipassign.ms.url=${IPASSIGN_URL}
+ipassign.ms.user=${ODL_USER}
+ipassign.ms.pwd=${ODL_PASSWORD}
+# CDS Naming mS
+naming.ms.url=${NAMING_MS_URL}
+naming.ms.user=${ODL_USER}
+naming.ms.pwd=${ODL_PASSWORD}
 honeycomb.url=http://{honeycomb-instance-ip}:8183
 honeycomb.user=${HONEYCOMB_USER}
 honeycomb.pwd=${HONEYCOMB_PASSWORD}
@@ -29,6 +66,35 @@ restapi.vpp.xconnect.templatefile=vcpe-l2-interface.json
 restapi.tx.templatefile=tunnelxconn-allotted-resource.json
 restapi.parentsvc.templatefile=parent-provided-allotted-resource.json
 restapi.network-ar.templatefile=network-provided-allotted-resources.json
+restapi.pm.getpolicy.templatefile=pm-get-policy.json
+restapi.pm.createpolicy.templatefile=pm-create-policy.json
+restapi.pm.pushpolicy.templatefile=pm-push-policy.json
+restapi.pm.deletepolicypdp.templatefile=pm-delete-policy-pdp.json
+restapi.pm.deletepolicypap.templatefile=pm-delete-policy-pap.json
+restapi.portmirrorconfig.templatefile=port-mirror-configuration.json
+restapi.genconfig.templatefile=gc-configuration.json
+restapi.vnfsubinterfacegroup.templatefile=vnf-sub-interface-group.json
+restapi.bondingservice.templatefile=bonding-service.json
+restapi.bondingservicerebuild.templatefile=bonding-service-rebuild.json
+restapi.forwardingpath.templatefile=forwarding-path.json
+restapi.network.templatefile=network.json
+restapi.network-instance-group.templatefile=network-instance-group.json
+restapi.network-instance-group-network.templatefile=network-instance-group-network.json
+restapi.network-instance-group-vpn-binding.templatefile=network-instance-group-vpn-binding.json
+restapi.csm.serviceinstance.templatefile=csm-service-instance.json
+restapi.mS.allocateRT.templatefile=allocate-route-target.json
+restapi.mS.releaseRT.templatefile=release-route-target.json
+restapi.ss.vnf.templatefile=self-serve-vnf-assignments.json
+restapi.ss.vfmodule.templatefile=self-serve-vfmodule-assignments.json
+restapi.ss.caprelease.templatefile=self-serve-capacity-release.json
+restapi.ss.capreserve.templatefile=self-serve-capacity-reserve.json
+restapi.ss.capreserve.targettype=Site
+restapi.ss.mS.vlan.tag.assign.templatefile=self-serve-mS-vlan-tag-assignments.json
+restapi.ss.mS.vlan.tag.unassign.templatefile=self-serve-mS-vlan-tag-unassignments.json
+restapi.ss.mS.mac.address.assign.templatefile=self-serve-mS-mac-address-assign.json
+restapi.ss.mS.mac.address.unassign.templatefile=self-serve-mS-mac-address-unassign.json
+restapi.ss.cds.ipassign.templatefile=self-serve-ipassign-unassign.json
+restapi.ss.cds.naming.templatefile=self-serve-naming-unassign.json
 restapi.vnf-ar.templatefile=vnf-provided-allotted-resources.json
 restapi.services.templatefile=vcpe-services-service.json
 restapi.services.vnf.vfmodule.templatefile=vfmodule-vim-parameters.vgw.json
@@ -48,30 +114,49 @@ restapi.ss.mS.mac.address.unassign.templatefile=self-serve-mS-mac-address-unassi
 cloud-region.cloud-owner=CloudOwner
 
 # URLs
-restapi.cr-allottedresource=/restconf/config/GENERIC-RESOURCE-API:contrail-route-allotted-resources/contrail-route-allotted-resource/{allotted-resource-id}/
-restapi.sz-allottedresource=/restconf/config/GENERIC-RESOURCE-API:security-zone-allotted-resources/security-zone-allotted-resource/{allotted-resource-id}/
 restapi.brg-allottedresource=/restconf/config/GENERIC-RESOURCE-API:brg-allotted-resources/brg-allotted-resource/{allotted-resource-id}/
-restapi.vpp-honeycomb=/restconf/config/ietf-interfaces:interfaces/interface/{tunnel-name}/
-restapi.tx-allottedresource=/restconf/config/GENERIC-RESOURCE-API:tunnelxconn-allotted-resources/tunnelxconn-allotted-resource/{allotted-resource-id}/
-restapi.vnf-provided-allottedresource=/restconf/config/GENERIC-RESOURCE-API:services/service/{service-instance-id}/service-data/vnfs/vnf/{vnf-id}/vnf-data/vnf-provided-allotted-resources/
+restapi.cds.ipassign.service=/ippm/restservices/v2/ipaddresses/unassign/
+restapi.cds.naming.service=/web/service/v1/genNetworkElementName/cds/
+restapi.connection-attachment-allottedresource=/restconf/config/GENERIC-RESOURCE-API:connection-attachment-allotted-resources/connection-attachment-allotted-resource/{allotted-resource-id}/
+restapi.cr-allottedresource=/restconf/config/GENERIC-RESOURCE-API:contrail-route-allotted-resources/contrail-route-allotted-resource/{allotted-resource-id}/
+restapi.forwarding-path=/restconf/config/GENERIC-RESOURCE-API:services/service/{service-instance-id}/service-data/forwarding-paths/forwarding-path/
+restapi.gc-configuration=/restconf/config/GENERIC-RESOURCE-API:generic-configurations/gc-configuration/{configuration-id}/
+restapi.mS.allocateRT=/vpnmicroservice/v1/vpn/allocateroutetarget/
+restapi.mS.releaseRT=/vpnmicroservice/v1/vpn/releaseroutetarget/
+restapi.naming.gen-name.service=/web/service/v1/genNetworkElementName/
+restapi.network-by-id=/restconf/config/GENERIC-RESOURCE-API:services/service/{service-instance-id}/service-data/networks/network/{network-id}/
+restapi.network-instance-group-network=/restconf/config/GENERIC-RESOURCE-API:services/service/{service-instance-id}/service-data/network-instance-groups/network-instance-group/{network-instance-group-id}/networks/network/{network-id}/
+restapi.network-instance-group-network=/restconf/config/GENERIC-RESOURCE-API:services/service/{service-instance-id}/service-data/network-instance-groups/network-instance-group/{network-instance-group-id}/networks/network/{network-id}/
+restapi.network-instance-group-vpn-binding=/restconf/config/GENERIC-RESOURCE-API:services/service/{service-instance-id}/service-data/network-instance-groups/network-instance-group/{network-instance-group-id}/networks/network/{network-id}/vpn-bindings/{vpn-binding-id}/
+restapi.network-instance-group=/restconf/config/GENERIC-RESOURCE-API:services/service/{service-instance-id}/service-data/network-instance-groups/network-instance-group/{network-instance-group-id}/
+restapi.network-level-oper-status=/restconf/config/GENERIC-RESOURCE-API:services/service/{service-instance-id}/service-data/networks/network/{network-id}/network-data/network-level-oper-status/
 restapi.network-provided-allottedresource=/restconf/config/GENERIC-RESOURCE-API:services/service/{service-instance-id}/service-data/vnfs/vnf/{vnf-id}/vnf-data/vnf-provided-allotted-resources/
-restapi.pm-configuration=/restconf/config/GENERIC-RESOURCE-API:port-mirror-configurations/port-mirror-configuration/{configuration-id}/
+restapi.network-provided-resource=/restconf/config/GENERIC-RESOURCE-API:services/service/{service-instance-id}/service-data/networks/network/{network-id}/network-data/network-provided-allotted-resources/
+restapi.network-topology-identifier-structure=/restconf/config/GENERIC-RESOURCE-API:services/service/{service-instance-id}/service-data/networks/network/{network-id}/network-data/network-topology/network-topology-identifier-structure/
 restapi.network=/restconf/config/GENERIC-RESOURCE-API:services/service/{service-instance-id}/service-data/networks/
-restapi.vnf=/restconf/config/GENERIC-RESOURCE-API:services/service/{service-instance-id}/service-data/vnfs/
-restapi.vnf-api.service-information=/restconf/config/VNF-API:vnfs/vnf-list/{vnf-id}/service-data/
 restapi.parent-provided-resource=/restconf/config/GENERIC-RESOURCE-API:services/service/{service-instance-id}/service-data/provided-allotted-resources/provided-allotted-resource/{allotted-resource-id}/
-restapi.network-provided-resource=/restconf/config/GENERIC-RESOURCE-API:services/service/{service-instance-id}/service-data/networks/network/{network-id}/network-data/network-provided-allotted-resources/
-restapi.services=/restconf/config/GENERIC-RESOURCE-API:services/service/{service-instance-id}/
+restapi.pm-configuration=/restconf/config/GENERIC-RESOURCE-API:port-mirror-configurations/port-mirror-configuration/{configuration-id}/
+restapi.preload-network=/restconf/config/GENERIC-RESOURCE-API:preload-information/preload-list/{network-name}/network/preload-data/preload-network-topology-information/
+restapi.preloadinformation=/restconf/config/GENERIC-RESOURCE-API:preload-information/preload-list/
 restapi.service.vnf.vfmodule-resource=/restconf/config/GENERIC-RESOURCE-API:services/service/{service-instance-id}/service-data/vnfs/vnf/{vnf-id}/vnf-data/vf-modules/vf-module/{vf-module-id}/
-restapi.connection-attachment-allottedresource=/restconf/config/GENERIC-RESOURCE-API:connection-attachment-allotted-resources/connection-attachment-allotted-resource/{allotted-resource-id}/
-restapi.naming.gen-name.service=/web/service/v1/genNetworkElementName
-restapi.ss-pnf-assignments=/restconf/config/GENERIC-RESOURCE-API:services/service/{service-instance-id}/service-data/pnfs/pnf/{pnf-id}/
-restapi.ss-vnf-assignments=/restconf/config/GENERIC-RESOURCE-API:services/service/{service-instance-id}/service-data/vnfs/vnf/{vnf-id}/
-restapi.ss-vfmodule-assignments=/restconf/config/GENERIC-RESOURCE-API:services/service/{service-instance-id}/service-data/vnfs/vnf/{vnf-id}/vnf-data/vf-modules/vf-module/{vf-module-id}/
-restapi.ss-mS-vlan-tag-assign=/vlantagapi/v1/{action}
+restapi.services=/restconf/config/GENERIC-RESOURCE-API:services/service/{service-instance-id}/
 restapi.ss-mS-mac-address-assign=/api/macaddress/v1/service/assign/
 restapi.ss-mS-mac-address-unassign=/api/macaddress/v1/service/unassign/
-restapi.preload-network=/restconf/config/GENERIC-RESOURCE-API:preload-information/preload-list/{network-name}/network/preload-data/preload-network-topology-information/
-restapi.preloadinformation=/restconf/config/GENERIC-RESOURCE-API:preload-information/preload-list/
+restapi.ss-mS-vlan-tag-assign=/vlantagapi/v1/{action}
+restapi.ss-pnf-assignments=/restconf/config/GENERIC-RESOURCE-API:services/service/{service-instance-id}/service-data/pnfs/pnf/{pnf-id}/
+restapi.ss-vfmodule-assignments=/restconf/config/GENERIC-RESOURCE-API:services/service/{service-instance-id}/service-data/vnfs/vnf/{vnf-id}/vnf-data/vf-modules/vf-module/{vf-module-id}/
+restapi.ss-vnf-assignments=/restconf/config/GENERIC-RESOURCE-API:services/service/{service-instance-id}/service-data/vnfs/vnf/{vnf-id}/
+restapi.sz-allottedresource=/restconf/config/GENERIC-RESOURCE-API:security-zone-allotted-resources/security-zone-allotted-resource/{allotted-resource-id}/
+restapi.tx-allottedresource=/restconf/config/GENERIC-RESOURCE-API:tunnelxconn-allotted-resources/tunnelxconn-allotted-resource/{allotted-resource-id}/
 restapi.vf-module=/restconf/config/GENERIC-RESOURCE-API:services/service/{service-instance-id}/service-data/vnfs/vnf/{vnf-id}/vnf-data/vf-modules/vf-module/{vf-module-id}/
+restapi.vnf-api.service-information=/restconf/config/VNF-API:vnfs/vnf-list/{vnf-id}/service-data/
 restapi.vnf-assign=/restconf/config/GENERIC-RESOURCE-API:services/service/{service-instance-id}/service-data/vnfs/vnf/{vnf-id}/
+restapi.vnf-level-oper-status=/restconf/config/GENERIC-RESOURCE-API:services/service/{service-instance-id}/service-data/vnfs/vnf/{vnf-id}/vnf-data/vnf-level-oper-status/
+restapi.vnf-network=/restconf/config/GENERIC-RESOURCE-API:services/service/{service-instance-id}/service-data/vnfs/vnf/{vnf-id}/vnf-data/vnf-topology/vnf-resource-assignments/vnf-networks/vnf-network/{network-role}/
+restapi.vnf-networks=/restconf/config/GENERIC-RESOURCE-API:services/service/{service-instance-id}/service-data/vnfs/vnf/{vnf-id}/vnf-data/vnf-topology/vnf-resource-assignments/vnf-networks/
+restapi.vnf-onap-model-information=/restconf/config/GENERIC-RESOURCE-API:services/service/{service-instance-id}/service-data/vnfs/vnf/{vnf-id}/vnf-data/vnf-topology/onap-model-information/
+restapi.vnf-provided-allottedresource=/restconf/config/GENERIC-RESOURCE-API:services/service/{service-instance-id}/service-data/vnfs/vnf/{vnf-id}/vnf-data/vnf-provided-allotted-resources/
+restapi.vnf-sub-interface-group=/restconf/config/GENERIC-RESOURCE-API:services/service/{service-instance-id}/service-data/vnfs/vnf/{vnf-id}/vnf-data/vnf-sub-interface-groups/vnf-sub-interface-group/{vnfc-instance-group-function}/{network-instance-group-function}/{parent-port-role}/
+restapi.vnf-topology.onap-model-information=/restconf/config/GENERIC-RESOURCE-API:services/service/{service-instance-id}/service-data/vnfs/vnf/{vnf-id}/vnf-data/vnf-topology/onap-model-information/
+restapi.vnf=/restconf/config/GENERIC-RESOURCE-API:services/service/{service-instance-id}/service-data/vnfs/
+restapi.vpp-honeycomb=/restconf/config/ietf-interfaces:interfaces/interface/{tunnel-name}/
index 9bc78a3..c4f4b88 100644 (file)
@@ -21,7 +21,7 @@
 property.logDir = ${env:LOG_PATH:-./target}
 property.logLevel = ${env:LOG_LEVEL:-INFO}
 
-property.pattern = %d{ISO8601} | %-5p | %-16t | %-32c{1} | %X{currentGraph} - %X{nodeId} | %m%n
+property.pattern = %d{yyyy-MM-dd'T'HH:mm:ss.SSSXXX}|%X{RequestID}|%-16.16t|%-5.5p|%-32.32c{1}|%X{currentGraph} - %X{nodeId}|%replace{%m}{\\R}{ }%n
 
 #default mdc values
 property.ServiceName = INTERNAL
@@ -63,7 +63,7 @@ appender.debug.filePattern = ${logDir}/debug.log.%i
 appender.debug.immediateFlush = true
 appender.debug.append = true
 appender.debug.layout.type = PatternLayout
-appender.debug.layout.pattern = %d{yyyy-MM-dd'T'HH:mm:ss.SSSXXX}|%X{RequestID}|%-16.16t|%-5.5p|%-32.32c{1}|%X{currentGraph} - %X{nodeId}|%m%n
+appender.debug.layout.pattern = %d{yyyy-MM-dd'T'HH:mm:ss.SSSXXX}|%X{RequestID}|%-16.16t|%-5.5p|%-32.32c{1}|%X{currentGraph} - %X{nodeId}|%replace{%m}{\\R}{ }%n
 appender.debug.policies.type = Policies
 appender.debug.policies.size.type = SizeBasedTriggeringPolicy
 appender.debug.policies.size.size = 10MB
@@ -80,7 +80,7 @@ appender.error.filePattern = ${logDir}/error.log.%i
 appender.error.immediateFlush = true
 appender.error.append = true
 appender.error.layout.type = PatternLayout
-appender.error.layout.pattern = %d{yyyy-MM-dd'T'HH:mm:ss.SSSXXX}|%X{RequestID}|%-16.16t|$${ctx:ServiceName}|%X{PartnerName}|%X{TargetEntity}|%X{TargetServiceName}|%p|$${ctx:ErrorCode}|$${ctx:ErrorDesc}|%m%n
+appender.error.layout.pattern = %d{yyyy-MM-dd'T'HH:mm:ss.SSSXXX}|%X{RequestID}|%-16.16t|$${ctx:ServiceName}|%X{PartnerName}|%X{TargetEntity}|%X{TargetServiceName}|%p|$${ctx:ErrorCode}|$${ctx:ErrorDesc}|%replace{%m}{\\R}{ }%ex{full}{separator(\\n)}%n
 
 appender.error.policies.type = Policies
 appender.error.policies.size.type = SizeBasedTriggeringPolicy
@@ -98,7 +98,7 @@ appender.metric.filePattern = ${logDir}/metric.log.%i
 appender.metric.immediateFlush = true
 appender.metric.append = true
 appender.metric.layout.type = PatternLayout
-appender.metric.layout.pattern=%X{InvokeTimestamp}|%X{LogTimestamp}|%X{RequestID}|%X{ServiceInstanceID}|%-16.16t|%X{ServerFQDN}|%X{ServiceName}|%X{PartnerName}|%X{TargetEntity}|%X{TargetServiceName}|%X{StatusCode}|%X{ResponseCode}|%X{ResponseDesc}|%X{InstanceID}|%p|%X{Severity}|192.168.23.111|%X{ElapsedTime}|${hostName}|%X{ClientIPAddress}|%C{1}|||%X{TargetElement}|%markerSimpleName|%X|%X{currentGraph} - %X{nodeId}||%m%n
+appender.metric.layout.pattern=%X{InvokeTimestamp}|%X{LogTimestamp}|%X{RequestID}|%X{ServiceInstanceID}|%-16.16t|%X{ServerFQDN}|%X{ServiceName}|%X{PartnerName}|%X{TargetEntity}|%X{TargetServiceName}|%X{StatusCode}|%X{ResponseCode}|%X{ResponseDesc}|%X{InstanceID}|%p|%X{Severity}|192.168.23.111|%X{ElapsedTime}|${hostName}|%X{ClientIPAddress}|%C{1}|||%X{TargetElement}|%markerSimpleName|%replace{%X}{\\u007B|\\u007D}{}|%X{currentGraph} - %X{nodeId}||%m%n
 appender.metric.policies.type = Policies
 appender.metric.policies.size.type = SizeBasedTriggeringPolicy
 appender.metric.policies.size.size = 10MB
@@ -113,7 +113,7 @@ appender.audit.filePattern = ${logDir}/audit.log.%i
 appender.audit.immediateFlush = true
 appender.audit.append = true
 appender.audit.layout.type = PatternLayout
-appender.audit.layout.pattern=%X{EntryTimestamp}|%X{LogTimestamp}|%X{RequestID}|%X{ServiceInstanceID}|%-16.16t|%X{ServerFQDN}|%X{ServiceName}|%X{PartnerName}|%X{StatusCode}|%X{ResponseCode}|%X{ResponseDesc}|%X{InstanceID}|INFO|%X{Severity}|192.168.23.111|%X{ElapsedTime}|${hostName}|%X{ClientIPAddress}|%C{1}|%X{AUDIT-Unused}|%X{AUDIT-ProcessKey}|%markerSimpleName|%X|||%m%n
+appender.audit.layout.pattern=%X{EntryTimestamp}|%X{LogTimestamp}|%X{RequestID}|%X{ServiceInstanceID}|%-16.16t|%X{ServerFQDN}|%X{ServiceName}|%X{PartnerName}|%X{StatusCode}|%X{ResponseCode}|%X{ResponseDesc}|%X{InstanceID}|INFO|%X{Severity}|192.168.23.111|%X{ElapsedTime}|${hostName}|%X{ClientIPAddress}|%C{1}|%X{AUDIT-Unused}|%X{AUDIT-ProcessKey}|%markerSimpleName|%replace{%X}{\\u007B|\\u007D}{}|||%m%n
 appender.audit.policies.type = Policies
 appender.audit.policies.size.type = SizeBasedTriggeringPolicy
 appender.audit.policies.size.size = 10MB
@@ -160,4 +160,4 @@ logger.ccsdk.name = org.onap.ccsdk
 logger.ccsdk.level = DEBUG
 
 logger.onaplogging.name = org.onap.logging
-logger.onaplogging.level = DEBUG
\ No newline at end of file
+logger.onaplogging.level = DEBUG
diff --git a/ms/gra/gra-docker/src/main/resources/msoadaptor.properties b/ms/gra/gra-docker/src/main/resources/msoadaptor.properties
new file mode 100644 (file)
index 0000000..fb7fac9
--- /dev/null
@@ -0,0 +1,5 @@
+adaptorName=com.att.sdnctl.sli.adaptor.mso.MSOAdaptor
+mso.user=dummy
+mso.passwd=dummy
+mso.restriction.uri=https://msoapih-s3.ecomp.cci.att.com:30275/restriction
+mso.sleep.timer=2000
index 6bca0e0..66dd721 100644 (file)
 # ============LICENSE_END=========================================================
 ###
 
-export SDNC_HOME=${SDNC_HOME:-/opt/onap/sdnc}
-export GRA_JAR=${GRA_JAR:-@sdnc.gra.jar@}
-export SVCLOGIC_DIR=${SVCLOGIC_DIR:-opt/onap/sdnc/svclogic/graphs}
-export LOG_PATH=${LOG_PATH:-/var/log/onap/sdnc}
-export SDNC_CONFIG_DIR=${SDNC_CONFIG_DIR:-/opt/onap/sdnc/config}
-export MYSQL_DB_HOST=${MYSQL_DB_HOST:-dbhost}
+export SDNC_HOME=${SDNC_HOME:-/opt/sdnc/gra}
+export SVCLOGIC_DIR=${SVCLOGIC_DIR:-/opt/sdnc/gra/service-logic/graphs}
+export LOG_PATH=${LOG_PATH:-/var/log/sdnc}
+export SDNC_CONFIG_DIR=${SDNC_CONFIG_DIR:-/opt/sdnc/gra/config}
 export SVCLOGIC_PROPERTIES=${SVCLOGIC_PROPERTIES:-${SDNC_CONFIG_DIR}/svclogic.properties}
+export SSL_DIR=${SSL_DIR:-/opt/sdnc/data/ssl}
+export SECRETS_DIR=${SECRETS_DIR:-/opt/app/secrets}
+export K8_NAMESPACE=${K8_NAMESPACE:-default}
 
-cd $SDNC_HOME
+if [ -f ${SECRETS_DIR}/${K8_NAMESPACE}-keystore-cred ]
+then
+    export AAF_KEYSTORE_CRED=$(cat ${SECRETS_DIR}/${K8_NAMESPACE}-keystore-cred)
+else
+    ls -l ${SECRETS_DIR}
+    echo "Not found: ${SECRETS_DIR}/${K8_NAMESPACE}-keystore-cred"
+fi
+
+if [ -f ${SECRETS_DIR}/${K8_NAMESPACE}-trustore-cred ]
+then
+    export AAF_TRUSTORE_CRED=$(cat ${SECRETS_DIR}/${K8_NAMESPACE}-trustore-cred | grep cadi_truststore_password | cut -d '=' -f 2 )
+else
+    ls -l ${SECRETS_DIR}
+    echo "Not found: ${SECRETS_DIR}/${K8_NAMESPACE}-trusture-cred"
+fi
+
+if [ -f ${SECRETS_DIR}/${K8_NAMESPACE}-keystore-jks ]
+then
+    cat ${SECRETS_DIR}/${K8_NAMESPACE}-keystore-jks | base64 -d > ${SSL_DIR}/keystore.jks
+    echo "base64 dec ${SSL_DIR}/keystore.jks"
+else
+    ls -l ${SECRETS_DIR}
+    echo "Not found: ${SECRETS_DIR}/${K8_NAMESPACE}-keystore-jks"
+fi
+
+env | sort
+
+#
+# Wait for database
+#
+echo "Waiting for database"
+until mysqladmin ping -h ${MYSQL_DB_HOST} --silent; do
+  printf "."
+  sleep 1
+done
+echo -e "\nDatabase ready"
+
+# Create tablespace and user account
+
+#mysql -h ${MYSQL_DB_HOST} -u root -p${MYSQL_ROOT_PASSWORD} mysql <<-END
+#CREATE DATABASE ${MYSQL_DB_DATABASE};
+#CREATE USER '${MYSQL_DB_USER}'@'localhost' IDENTIFIED BY '${MYSQL_DB_PASSWD}';
+#CREATE USER '${MYSQL_DB_USER}'@'%' IDENTIFIED BY '${MYSQL_DB_PASSWD}';
+#GRANT ALL PRIVILEGES ON ${MYSQL_DB_DATABASE}.* TO '${MYSQL_DB_USER}'@'localhost' WITH GRANT OPTION;
+#GRANT ALL PRIVILEGES ON ${MYSQL_DB_DATABASE}.* TO '${MYSQL_DB_USER}'@'%' WITH GRANT OPTION;
+#commit;
+#END
 
-  echo "Waiting for mysql"
-  until mysql -h ${MYSQL_DB_HOST} -u ${MYSQL_USER} -p${MYSQL_PASSWORD} ${MYSQL_DATABASE} &> /dev/null
-  do
-    printf "."
-    sleep 1
-  done
-  echo -e "\nmysql ready"
-  
-java -DserviceLogicDirectory=${SVCLOGIC_DIR} -DLOG_PATH=${LOG_PATH} -jar ${SDNC_HOME}/lib/${GRA_JAR}
+# Initialize schema
+if [ -f ${SDNC_CONFIG_DIR}/schema-mysql.sql ]
+then 
+  mysql -h ${MYSQL_DB_HOST} -u ${MYSQL_USER} -p${MYSQL_PASSWORD} ${MYSQL_DATABASE} < ${SDNC_CONFIG_DIR}/schema-mysql.sql
+fi
+
+# Load data
+if [ -f ${SDNC_CONFIG_DIR}/data-mysql.sql ]
+then 
+  mysql -h ${MYSQL_DB_HOST} -u ${MYSQL_USER} -p${MYSQL_PASSWORD} ${MYSQL_DATABASE} < ${SDNC_CONFIG_DIR}/data-mysql.sql
+fi
+
+cd $SDNC_HOME
+java ${JAVA_OPTS} -DserviceLogicDirectory=${SVCLOGIC_DIR} -DLOG_PATH=${LOG_PATH} -Dlog4j2.configurationFile=file:${SDNC_CONFIG_DIR}/log4j2.properties -jar ${SDNC_HOME}/lib/gra-app-*.jar
diff --git a/ms/gra/gra-docker/src/main/resources/truststore.jks b/ms/gra/gra-docker/src/main/resources/truststore.jks
new file mode 100644 (file)
index 0000000..6798c60
Binary files /dev/null and b/ms/gra/gra-docker/src/main/resources/truststore.jks differ
diff --git a/ms/gra/gra-docker/src/main/scripts/chmodScripts.sh b/ms/gra/gra-docker/src/main/scripts/chmodScripts.sh
new file mode 100644 (file)
index 0000000..50d959f
--- /dev/null
@@ -0,0 +1,3 @@
+#/bin/bash
+echo $(pwd)
+chmod 755 target/docker-stage/opt/sdnc/gra/bin/startGra.sh
diff --git a/ms/gra/gra-docker/src/main/scripts/compareContrail.sh b/ms/gra/gra-docker/src/main/scripts/compareContrail.sh
new file mode 100755 (executable)
index 0000000..5c613e7
--- /dev/null
@@ -0,0 +1,55 @@
+#!/bin/bash
+
+if [ $# -eq 2 ]
+then
+       verbose=false
+       file1=$1
+       file2=$2
+elif [ $# -eq 3 -a $1 = "-v" ]
+then
+       verbose=true
+       file1=$2
+       file2=$3
+else
+       echo "Usage: $0 [-v] file1 file2"
+       exit 1
+fi
+
+tmppfx=contrail$$
+
+formattedfile1=/tmp/$tmppfx-formatted1
+formattedfile2=/tmp/$tmppfx-formatted2
+idlist1=/tmp/$tmppfx-contrail-ids-1
+idlist2=/tmp/$tmppfx-contrail-ids-2
+
+
+echo "Comparing $file1 to $file2 ...."
+
+cat $file1 | python3 -mjson.tool > $formattedfile1
+cat $file2 | python3 -mjson.tool > $formattedfile2
+
+cat $formattedfile1 | grep '"allotted-resource-id":' | cut -d: -f2 | sed -e "s/,$//" -e 's/\"//g' -e '/^[[:space:]]*$/d' | sort -u > $idlist1
+cat $formattedfile2 | grep '"allotted-resource-id":' | cut -d: -f2 | sed -e "s/,$//" -e 's/\"//g' -e '/^[[:space:]]*$/d' | sort -u > $idlist2
+
+echo
+echo "Diff of allotted resource ids:"
+echo "------------------------------"
+diff $idlist1 $idlist2
+
+if [ "$verbose" = "true" ]
+then
+       echo
+       echo "Full diff:"
+       echo "----------"
+       diff $formattedfile1 $formattedfile2
+fi
+
+echo
+echo "Allotted resource counts:"
+echo "-------------------------"
+echo "   $file1 : $(cat $idlist1 | wc -l)"
+echo "   $file2 : $(cat $idlist2 | wc -l)"
+
+
+
+
diff --git a/ms/gra/gra-docker/src/main/scripts/comparePortmirror.sh b/ms/gra/gra-docker/src/main/scripts/comparePortmirror.sh
new file mode 100755 (executable)
index 0000000..5a39660
--- /dev/null
@@ -0,0 +1,55 @@
+#!/bin/bash
+
+if [ $# -eq 2 ]
+then
+       verbose=false
+       file1=$1
+       file2=$2
+elif [ $# -eq 3 -a $1 = "-v" ]
+then
+       verbose=true
+       file1=$2
+       file2=$3
+else
+       echo "Usage: $0 [-v] file1 file2"
+       exit 1
+fi
+
+tmppfx=portmirror$$
+
+formattedfile1=/tmp/$tmppfx-formatted1
+formattedfile2=/tmp/$tmppfx-formatted2
+idlist1=/tmp/$tmppfx-configuration-ids-1
+idlist2=/tmp/$tmppfx-configuration-ids-2
+
+
+echo "Comparing $file1 to $file2 ...."
+
+cat $file1 | python3 -mjson.tool > $formattedfile1
+cat $file2 | python3 -mjson.tool > $formattedfile2
+
+cat $formattedfile1 | grep '"configuration-id":' | cut -d: -f2 | sed -e "s/,$//" -e 's/\"//g' -e '/^[[:space:]]*$/d' | sort -u > $idlist1
+cat $formattedfile2 | grep '"configuration-id":' | cut -d: -f2 | sed -e "s/,$//" -e 's/\"//g' -e '/^[[:space:]]*$/d' | sort -u > $idlist2
+
+echo
+echo "Diff of configuration ids:"
+echo "--------------------------"
+diff $idlist1 $idlist2
+
+if [ "$verbose" = "true" ]
+then
+       echo
+       echo "Full diff:"
+       echo "----------"
+       diff $formattedfile1 $formattedfile2
+fi
+
+echo
+echo "Configuration counts:"
+echo "---------------------"
+echo "   $file1 : $(cat $idlist1 | wc -l)"
+echo "   $file2 : $(cat $idlist2 | wc -l)"
+
+
+
+
diff --git a/ms/gra/gra-docker/src/main/scripts/comparePreload.sh b/ms/gra/gra-docker/src/main/scripts/comparePreload.sh
new file mode 100755 (executable)
index 0000000..4e8ab79
--- /dev/null
@@ -0,0 +1,55 @@
+#!/bin/bash
+
+if [ $# -eq 2 ]
+then
+       verbose=false
+       file1=$1
+       file2=$2
+elif [ $# -eq 3 -a $1 = "-v" ]
+then
+       verbose=true
+       file1=$2
+       file2=$3
+else
+       echo "Usage: $0 [-v] file1 file2"
+       exit 1
+fi
+
+tmppfx=preload$$
+
+formattedfile1=/tmp/$tmppfx-formatted1
+formattedfile2=/tmp/$tmppfx-formatted2
+idlist1=/tmp/$tmppfx-preload-ids-1
+idlist2=/tmp/$tmppfx-preload-ids-2
+
+
+echo "Comparing $file1 to $file2 ...."
+
+cat $file1 | python3 -mjson.tool > $formattedfile1
+cat $file2 | python3 -mjson.tool > $formattedfile2
+
+cat $formattedfile1 | grep '"preload-id":' | cut -d: -f2 | sed -e "s/,$//" -e 's/\"//g' -e '/^[[:space:]]*$/d' | sort -u > $idlist1
+cat $formattedfile2 | grep '"preload-id":' | cut -d: -f2 | sed -e "s/,$//" -e 's/\"//g' -e '/^[[:space:]]*$/d' | sort -u > $idlist2
+
+echo
+echo "Diff of preload ids:"
+echo "--------------------"
+diff $idlist1 $idlist2
+
+if [ "$verbose" = "true" ]
+then
+       echo
+       echo "Full diff:"
+       echo "----------"
+       diff $formattedfile1 $formattedfile2
+fi
+
+echo
+echo "Preload id counts:"
+echo "------------------"
+echo "   $file1 : $(cat $idlist1 | wc -l)"
+echo "   $file2 : $(cat $idlist2 | wc -l)"
+
+
+
+
diff --git a/ms/gra/gra-docker/src/main/scripts/compareSvc.sh b/ms/gra/gra-docker/src/main/scripts/compareSvc.sh
new file mode 100755 (executable)
index 0000000..0c977b5
--- /dev/null
@@ -0,0 +1,55 @@
+#!/bin/bash
+
+if [ $# -eq 2 ]
+then
+       verbose=false
+       file1=$1
+       file2=$2
+elif [ $# -eq 3 -a $1 = "-v" ]
+then
+       verbose=true
+       file1=$2
+       file2=$3
+else
+       echo "Usage: $0 [-v] file1 file2"
+       exit 1
+fi
+
+tmppfx=svc$$
+
+formattedfile1=/tmp/$tmppfx-formatted1
+formattedfile2=/tmp/$tmppfx-formatted2
+svcinstancelist1=/tmp/$tmppfx-svc-instance-ids-1
+svcinstancelist2=/tmp/$tmppfx-svc-instance-ids-2
+
+
+echo "Comparing $file1 to $file2 ...."
+
+cat $file1 | python3 -mjson.tool > $formattedfile1
+cat $file2 | python3 -mjson.tool > $formattedfile2
+
+cat $formattedfile1 | grep '"service-instance-id":' | cut -d: -f2 | sed -e "s/,$//" -e 's/\"//g' -e '/^[[:space:]]*$/d' | sort -u > $svcinstancelist1
+cat $formattedfile2 | grep '"service-instance-id":' | cut -d: -f2 | sed -e "s/,$//" -e 's/\"//g' -e '/^[[:space:]]*$/d' | sort -u > $svcinstancelist2
+
+echo
+echo "Diff of service instance ids:"
+echo "-----------------------------"
+diff $svcinstancelist1 $svcinstancelist2
+
+if [ "$verbose" = "true" ]
+then
+       echo
+       echo "Full diff:"
+       echo "----------"
+       diff $formattedfile1 $formattedfile2
+fi
+
+echo
+echo "Service instance counts:"
+echo "------------------------"
+echo "   $file1 : $(cat $svcinstancelist1 | wc -l)"
+echo "   $file2 : $(cat $svcinstancelist2 | wc -l)"
+
+
+
+
diff --git a/ms/gra/gra-docker/src/main/scripts/exportGraDaexim.sh b/ms/gra/gra-docker/src/main/scripts/exportGraDaexim.sh
new file mode 100644 (file)
index 0000000..08da8b0
--- /dev/null
@@ -0,0 +1,40 @@
+#!/bin/bash
+
+ODL_USER=${ODL_USER:-m27434@dev.sdncp.att.com}
+ODL_PASSWORD=${AAF_MECHID_CRED:-admin}
+ODL_URI=${ODL_URI:-https://localhost:8443}
+
+export TMPDIR=/tmp/daexim-$$
+
+if [ $# -ne 1 ]
+then
+    echo "Usage: $0 filename"
+    exit 1
+fi
+
+
+set -e
+
+mkdir $TMPDIR
+
+if [[ $1 == /* ]]
+then
+    tarfile=$1
+else
+    tarfile=$TMPDIR/$1
+fi
+
+echo "Exporting services ..."
+curl -k -u${ODL_USER}:${ODL_PASSWORD} ${ODL_URI}/restconf/config/GENERIC-RESOURCE-API:services/ > ${TMPDIR}/services_config.json
+echo "Exporting contrail data ..."
+curl -k -u${ODL_USER}:${ODL_PASSWORD} ${ODL_URI}/restconf/config/GENERIC-RESOURCE-API:contrail-route-allotted-resources/ > ${TMPDIR}/contrail_config.json
+echo "Exporting port mirror data ..."
+curl -k -u${ODL_USER}:${ODL_PASSWORD} ${ODL_URI}/restconf/config/GENERIC-RESOURCE-API:port-mirror-configurations/ > ${TMPDIR}/portmirror_config.json
+echo "Exporting preload data ..."
+curl -k -u${ODL_USER}:${ODL_PASSWORD} ${ODL_URI}/restconf/config/GENERIC-RESOURCE-API:preload-information/ > ${TMPDIR}/preload_config.json
+
+cd $TMPDIR
+tar czf $tarfile ./*.json
+
+echo Exported data is in $tarfile
+
diff --git a/ms/gra/gra-docker/src/main/scripts/graToMdsal.sh b/ms/gra/gra-docker/src/main/scripts/graToMdsal.sh
new file mode 100644 (file)
index 0000000..9fb62f8
--- /dev/null
@@ -0,0 +1,104 @@
+#!/bin/bash
+
+# Copies data from NFT Azure GRA node and stores in MDSAL in NFT EOM
+
+TMPNAME=gra-mdsal-$$
+
+if [ $# -eq 2 ]
+then
+    fetchFile=false
+    NFT_AZURE_EXPORT_FILE=$1
+    NFT_EOM_URL=$2
+elif [ $# -eq 3 ]
+then
+    fetchFile=true
+    NFT_AZURE_EXPORT_FILE=$TMPNAME.tar.gz
+    NFT_AZURE_NAMESPACE=$1
+    NFT_AZURE_GRA_POD=$2
+    NFT_EOM_URL=$3
+else
+    echo "Usage: $0 {export-file-name | nft-namespace gra-pod-name} eom-url"
+    exit 1
+fi
+
+
+# Credentials configuration
+NFT_AZURE_USER=${NFT_AZURE_USER:-m27434@dev.sdncp.att.com}
+NFT_AZURE_PASSWORD=${NFT_AZURE_PASSWORD:-sdncp20190501}
+NFT_EOM_USER=${NFT_EOM_USER:-admin}
+NFT_EOM_PASSWORD=${NFT_EOM_PASSWORD:-admin}
+
+set -e
+
+TMPNAME=gra-mdsal-$$
+mkdir /tmp/$TMPNAME
+
+if [ "$fetchFile" = "true" ]
+then
+    # Export data on Azure
+    kubectl -n $NFT_AZURE_NAMESPACE exec -ti $NFT_AZURE_GRA_POD -c gra -- env ODL_USER=$NFT_AZURE_USER AAF_MECHID_CRED=$NFT_AZURE_PASSWORD /opt/sdnc/gra/bin/exportGraDaexim.sh /tmp/$NFT_AZURE_EXPORT_FILE
+
+
+    # Put exported data to NFT EOM
+    kubectl -n $NFT_AZURE_NAMESPACE cp $NFT_AZURE_GRA_POD:/tmp/$NFT_AZURE_EXPORT_FILE /tmp/$TMPNAME/$NFT_AZURE_EXPORT_FILE
+else
+    cp $NFT_AZURE_EXPORT_FILE /tmp/$TMPNAME
+fi
+
+cd /tmp/$TMPNAME
+tar xzf $NFT_AZURE_EXPORT_FILE
+
+# Massage files and create daexim input
+echo "{" > lsc_backup_config_$TMPNAME.json
+addComma=false
+if [ -f services_config.json ]
+then
+    echo "Converting service data ..."
+    cat services_config.json | python3 -mjson.tool | sed -e "s/services/GENERIC-RESOURCE-API:services/" -e "/\"gateway-address\": \"\"/d"  > services_config_upd.json
+    cat services_config_upd.json | sed -e "1s/{//" -e "$ s/}//" >> lsc_backup_config_$TMPNAME.json
+    addComma=true
+fi
+
+if [ -f contrail_config.json ]
+then
+    if [ "$addComma" = "true" ]
+    then
+        echo "," >> lsc_backup_config_$TMPNAME.json
+    fi
+    cat contrail_config.json | sed -e "s/{//" -e "s/contrail-route-allotted-resources/GENERIC-RESOURCE-API:contrail-route-allotted-resources/" -e "s/}$//" >> lsc_backup_config_$TMPNAME.json
+    addComma=true
+fi
+
+if [ -f portmirror_config.json ]
+then
+    if [ "$addComma" = "true" ]
+    then
+        echo "," >> lsc_backup_config_$TMPNAME.json
+    fi
+    cat portmirror_config.json | sed -e "s/{//" -e "s/port-mirror-configurations/GENERIC-RESOURCE-API:port-mirror-configurations/" -e "s/}$//" >> lsc_backup_config_$TMPNAME.json
+    addComma=true
+fi
+
+echo "}" >> lsc_backup_config_$TMPNAME.json
+
+echo "Exported data files are in /tmp/$TMPNAME"
+
+if [ -f services_config_upd.json ]
+then
+    echo "Importing service data ..."
+    curl -k -v -u${NFT_EOM_USER}:${NFT_EOM_PASSWORD} -H "Content-Type: application/json" -X PUT -d@services_config_upd.json ${NFT_EOM_URL}/restconf/config/GENERIC-RESOURCE-API:services/
+fi
+
+if [ -f contrail_config.json ]
+then
+    echo "Importing contrail data ..."
+    curl -k -v -u${NFT_EOM_USER}:${NFT_EOM_PASSWORD} -H "Content-Type: application/json" -X PUT -d@contrail_config.json ${NFT_EOM_URL}/restconf/config/GENERIC-RESOURCE-API:contrail-route-allotted-resources/
+fi
+
+if [ -f portmirror_config.json ]
+then
+    echo "Importing port mirror data ..."
+    curl -k -v -u${NFT_EOM_USER}:${NFT_EOM_PASSWORD} -H "Content-Type: application/json" -X PUT -d@portmirror_config.json ${NFT_EOM_URL}/restconf/config/GENERIC-RESOURCE-API:port-mirror-configurations/
+fi
+
+
diff --git a/ms/gra/gra-docker/src/main/scripts/importGraDaexim.sh b/ms/gra/gra-docker/src/main/scripts/importGraDaexim.sh
new file mode 100755 (executable)
index 0000000..2c90421
--- /dev/null
@@ -0,0 +1,207 @@
+#!/bin/bash
+
+export CHUNK_SIZE=${CHUNK_SIZE:-75}
+set -e
+CURLFLAGS="--silent --show-error"
+if [ $# -eq 3 ]
+then
+    if [ "$1" != "-v" ]
+    then
+        echo "Usage: $0 [-v] filename controller-url"
+        exit 1
+    fi
+    CURLFLAGS="-v"
+    filename=$2
+    url=$3
+elif [ $# -eq 2 ]
+then
+    filename=$1
+    url=$2
+else
+    echo "Usage: $0 [-v] filename controller-url"
+    exit 1
+fi
+
+ODL_USER=${ODL_USER:-admin}
+ODL_PASSWORD=${ODL_PASSWORD:-admin}
+
+
+export TMPDIR=/tmp/daexim-$$
+# Unzip file
+if [[ "$filename" == *.zip ]]
+then
+    unzip -qd $TMPDIR $filename
+    DAEXIM_CONFIG=$(find $TMPDIR -name *config.json)
+elif [[ "$filename" == *config.json ]]
+then
+    mkdir $TMPDIR
+    DAEXIM_CONFIG=$filename
+else
+    echo "$filename is not a recognized format"
+    exit 1
+fi
+
+
+
+cat ${DAEXIM_CONFIG} | python3 -c '
+import sys,json,os
+
+data = json.load(sys.stdin)
+
+chunk_size = int(os.environ["CHUNK_SIZE"])
+if chunk_size == "":
+    chunk_size = 75
+
+if "GENERIC-RESOURCE-API:services" in data:
+    chunk = 0
+    lineno = chunk_size
+    f = None
+    for service in data["GENERIC-RESOURCE-API:services"]["service"]:
+        if lineno >= chunk_size:
+            chunk = chunk+1
+            lineno = 1
+            if f != None:
+                print ("]}}", file=f)
+                f.flush()
+                f.close()
+            outfile = os.environ["TMPDIR"] + "/config_gra_services_"+str(chunk).zfill(3)+".json"
+            f = open(outfile, "w")
+            print("{\"services\":", file=f, end="")
+            print("{\"service\":[", file=f, end="")
+            json.dump(service, f)
+        else:
+            lineno = lineno+1
+            print(",",file=f, end="")
+            json.dump(service, f)
+    if f != None:
+        print("]}}", file=f)
+        f.flush()
+        f.close()
+    print("Split "+str(len(data["GENERIC-RESOURCE-API:services"]["service"]))+ " services into "+str(chunk)+" chunks")
+
+if "GENERIC-RESOURCE-API:contrail-route-allotted-resources" in data:
+    chunk = 0
+    lineno = chunk_size
+    f = None
+    for contrail_route in data["GENERIC-RESOURCE-API:contrail-route-allotted-resources"]["contrail-route-allotted-resource"]:
+        if lineno >= chunk_size:
+            chunk = chunk+1
+            lineno = 1
+            if f != None:
+                print ("]}}", file=f)
+                f.flush()
+                f.close()
+            outfile = os.environ["TMPDIR"] + "/config_gra_contrail_"+str(chunk).zfill(3)+".json"
+            f = open(outfile, "w")
+            print("{\"contrail-route-allotted-resources\":", file=f, end="")
+            print("{\"contrail-route-allotted-resource\":[", file=f, end="")
+            json.dump(contrail_route, f)
+        else:
+            lineno = lineno+1
+            print(",",file=f, end="")
+            json.dump(contrail_route, f)
+    if f != None:
+        print("]}}", file=f)
+        f.flush()
+        f.close()
+    print("Split "+ str(len(data["GENERIC-RESOURCE-API:contrail-route-allotted-resources"]["contrail-route-allotted-resource"]))+ " contrail-route-allotted-services into "+str(chunk)+" chunks")
+
+if "GENERIC-RESOURCE-API:port-mirror-configurations" in data:
+    chunk = 0
+    lineno = chunk_size
+    f = None
+    for port_mirror in data["GENERIC-RESOURCE-API:port-mirror-configurations"]["port-mirror-configuration"]:
+        if lineno >= chunk_size:
+            chunk = chunk+1
+            lineno = 1
+            if f != None:
+                print ("]}}", file=f)
+                f.flush()
+                f.close()
+            outfile = os.environ["TMPDIR"] + "/config_gra_port_mirror_"+str(chunk).zfill(3)+".json"
+            f = open(outfile, "w")
+            print("{\"port-mirror-configurations\":", file=f, end="")
+            print("{\"port-mirror-configuration\":[", file=f, end="")
+            json.dump(port_mirror, f)
+        else:
+            lineno = lineno+1
+            print(",",file=f, end="")
+            json.dump(port_mirror, f)
+    if f != None:
+        print("]}}", file=f)
+        f.flush()
+        f.close()
+    print("Split "+str(len(data["GENERIC-RESOURCE-API:port-mirror-configurations"]["port-mirror-configuration"]))+" port-mirror-configuration into "+str(chunk)+" chunks")
+
+if "GENERIC-RESOURCE-API:preload-information" in data:
+    chunk = 0
+    lineno = chunk_size
+    f = None
+    for preload in data["GENERIC-RESOURCE-API:preload-information"]["preload-list"]:
+        if lineno >= chunk_size:
+            chunk = chunk+1
+            lineno = 0
+            if f != None:
+                print ("]}}", file=f)
+                f.flush()
+                f.close()
+            outfile = os.environ["TMPDIR"] + "/config_gra_preloads_"+str(chunk).zfill(3)+".json"
+            f = open(outfile, "w")
+            print("{\"preload-information\":", file=f, end="")
+            print("{\"preload-list\":[", file=f, end="")
+            json.dump(preload, f)
+        else:
+            lineno = lineno+1
+            print(",",file=f, end="")
+            json.dump(preload, f)
+    if f != None:
+        print("]}}", file=f)
+        f.flush()
+        f.close()
+    print ("Split "+str(len(data["GENERIC-RESOURCE-API:preload-information"]["preload-list"]))+" preloads into "+str(chunk)+" chunks")'
+
+first=true
+
+if [ $(ls -1 $TMPDIR/config_gra_services_*.json 2>/dev/null | wc -l) -gt 0 ]
+then
+    echo "Transferring services data ..."
+    for file in $(ls $TMPDIR/config_gra_services_*.json)
+    do
+        echo "Transferring file $file ..."
+        curl ${CURLFLAGS} --fail -k -u${ODL_USER}:${ODL_PASSWORD} -H "Content-Type: application/json" -X PUT -d@$file ${url}/restconf/config/GENERIC-RESOURCE-API:services/
+    done
+fi
+
+if [ $(ls -1 $TMPDIR/config_gra_contrail_*.json 2>/dev/null | wc -l) -gt 0 ]
+then
+    echo "Transferring contrail data ..."
+    for file in $(ls $TMPDIR/config_gra_contrail_*.json)
+    do
+        echo "Transferring file $file ..."
+        curl ${CURLFLAGS} --fail -k -u${ODL_USER}:${ODL_PASSWORD} -H "Content-Type: application/json" -X PUT -d@$file ${url}/restconf/config/GENERIC-RESOURCE-API:contrail-route-allotted-resources/
+    done
+fi
+
+if [ $(ls -1 $TMPDIR/config_gra_port_mirror_*.json 2>/dev/null | wc -l) -gt 0 ]
+then
+    echo "Transferring port mirror data ..."
+    for file in $(ls $TMPDIR/config_gra_port_mirror_*.json)
+    do
+        echo "Transferring file $file ..."
+        curl ${CURLFLAGS} --fail -k -u${ODL_USER}:${ODL_PASSWORD} -H "Content-Type: application/json" -X PUT -d@$file ${url}/restconf/config/GENERIC-RESOURCE-API:port-mirror-configurations/
+    done
+fi
+
+if [ $(ls -1 $TMPDIR/config_gra_preloads_*.json 2>/dev/null | wc -l) -gt 0 ]
+then
+    echo "Transferring preload data ..."
+    first=true
+    for file in $(ls $TMPDIR/config_gra_preloads_*.json)
+    do
+        echo "Transferring file $file ..."
+        curl ${CURLFLAGS} --fail -k -u${ODL_USER}:${ODL_PASSWORD} -H "Content-Type: application/json" -X PUT -d@$file ${url}/restconf/config/GENERIC-RESOURCE-API:preload-information/
+    done
+fi
+
+rm -rf $TMPDIR
+echo "Done!"
\ No newline at end of file
diff --git a/ms/gra/gra-docker/src/main/templates/contrail-route-allotted-resource.json b/ms/gra/gra-docker/src/main/templates/contrail-route-allotted-resource.json
new file mode 100644 (file)
index 0000000..f5d862d
--- /dev/null
@@ -0,0 +1,102 @@
+{
+      "contrail-route-allotted-resource": { 
+               "allotted-resource-id": ${ar.allotted-resource-id},
+               "allotted-resource-data": {
+                       "contrail-route-topology": {
+                               "allotted-resource-identifiers": {
+                                       "consuming-service-instance-id": ${ar.allotted-resource-data.contrail-route-topology.allotted-resource-identifiers.consuming-service-instance-id},
+                                       "allotted-resource-name": ${ar.allotted-resource-data.contrail-route-topology.allotted-resource-identifiers.allotted-resource-name},
+                                       "allotted-resource-id": ${ar.allotted-resource-data.contrail-route-topology.allotted-resource-identifiers.allotted-resource-id},
+                                       "parent-service-instance-id": ${ar.allotted-resource-data.contrail-route-topology.allotted-resource-identifiers.parent-service-instance-id},
+                                       "allotted-resource-type": ${ar.allotted-resource-data.contrail-route-topology.allotted-resource-identifiers.allotted-resource-type}
+                               },
+                               "onap-model-information": {
+                                       "model-invariant-uuid": ${ar.allotted-resource-data.contrail-route-topology.onap-model-information.model-invariant-uuid},
+                                       "model-customization-uuid": ${ar.allotted-resource-data.contrail-route-topology.onap-model-information.model-customization-uuid},
+                                       "model-uuid": ${ar.allotted-resource-data.contrail-route-topology.onap-model-information.model-uuid},
+                                       "model-version": ${ar.allotted-resource-data.contrail-route-topology.onap-model-information.model-version}
+                               },
+                               "contrail-route-assignments": {
+                                       "fq-name": ${ar.allotted-resource-data.contrail-route-topology.contrail-route-assignments.fq-name},
+                                       "contrail-id": ${ar.allotted-resource-data.contrail-route-topology.contrail-route-assignments.contrail-id},
+                                       "vlan-tag": ${ar.allotted-resource-data.contrail-route-topology.contrail-route-assignments.vlan-tag},
+                                       "source-network": {
+                                               "network-id": ${ar.allotted-resource-data.contrail-route-topology.contrail-route-assignments.source-network.network-id},
+                                               "network-role": ${ar.allotted-resource-data.contrail-route-topology.contrail-route-assignments.source-network.network-role}
+                                       },
+                                       "dest-network": {
+                                               "network-id": ${ar.allotted-resource-data.contrail-route-topology.contrail-route-assignments.dest-network.network-id},
+                                               "network-role": ${ar.allotted-resource-data.contrail-route-topology.contrail-route-assignments.dest-network.network-role}
+                                       },
+                                       "contrail-applied-service": {
+                                               "service-instance-id": ${ar.allotted-resource-data.contrail-route-topology.contrail-route-assignments.contrail-applied-service.service-instance-id},
+                                               "vnf-id": ${ar.allotted-resource-data.contrail-route-topology.contrail-route-assignments.contrail-applied-service.vnf-id},
+                                               "contrail-fqdn": ${ar.allotted-resource-data.contrail-route-topology.contrail-route-assignments.contrail-applied-service.contrail-fqdn}
+                                       }
+                               },
+                               "contrail-route-parameters": {
+                                       "param" : [
+  ${repeat:ar.allotted-resource-data.contrail-route-topology.contrail-route-parameters_length:
+                                       {
+                                               "name": ${ar.allotted-resource-data.contrail-route-topology.contrail-route-parameters[${1}].name},
+                                               "value": ${ar.allotted-resource-data.contrail-route-topology.contrail-route-parameters[${1}].value}
+                                       }
+   }
+                                       ]
+                               }
+                       },
+                       "allotted-resource-operation-information": {
+                       "allotted-resource-information": {
+                               "allotted-resource-id": ${ar.allotted-resource-data.allotted-resource-operation-information.allotted-resource-information.allotted-resource-id},
+                                       "allotted-resource-type": ${ar.allotted-resource-data.allotted-resource-operation-information.allotted-resource-information.allotted-resource-type},
+                                       "parent-service-instance-id": ${ar.allotted-resource-data.allotted-resource-operation-information.allotted-resource-information.parent-service-instance-id},
+                                       "onap-model-information": {
+                                               "model-invariant-uuid": ${ar.allotted-resource-data.allotted-resource-operation-information.allotted-resource-information.onap-model-information.model-invariant-uuid},
+                                               "model-customization-uuid": ${ar.allotted-resource-data.allotted-resource-operation-information.allotted-resource-information.onap-model-information.model-customization-uuid},
+                                               "model-uuid": ${ar.allotted-resource-data.allotted-resource-operation-information.allotted-resource-information.onap-model-information.model-uuid},
+                                               "model-version": ${ar.allotted-resource-data.allotted-resource-operation-information.allotted-resource-information.onap-model-information.model-version}
+                               }
+                       },
+                       "sdnc-request-header": {
+                               "svc-request-id": ${ar.allotted-resource-data.allotted-resource-operation-information.sdnc-request-header.svc-request-id},
+                               "svc-action": ${ar.allotted-resource-data.allotted-resource-operation-information.sdnc-request-header.svc-action}
+                       },
+                       "request-information": {
+                               "request-id": ${ar.allotted-resource-data.allotted-resource-operation-information.request-information.request-id},
+                               "source": ${ar.allotted-resource-data.allotted-resource-operation-information.request-information.source},
+                               "order-version": ${ar.allotted-resource-data.allotted-resource-operation-information.request-information.order-version},
+                               "order-number": ${ar.allotted-resource-data.allotted-resource-operation-information.request-information.order-number},
+                               "notification-url": ${ar.allotted-resource-data.allotted-resource-operation-information.request-information.notification-url},
+                               "request-action": ${ar.allotted-resource-data.allotted-resource-operation-information.request-information.request-action}
+                       },
+                       "contrail-route-request-input": {
+                               "source-network": {
+                                       "network-id": ${ar.allotted-resource-data.allotted-resource-operation-information.contrail-route-request-input.source-network.network-id},
+                                       "network-role": ${ar.allotted-resource-data.allotted-resource-operation-information.contrail-route-request-input.source-network.network-role}
+                               },
+                               "dest-network": {
+                                       "network-id": ${ar.allotted-resource-data.allotted-resource-operation-information.contrail-route-request-input.dest-network.network-id},
+                                       "network-role": ${ar.allotted-resource-data.allotted-resource-operation-information.contrail-route-request-input.dest-network.network-role}
+                               },
+                               "contrail-applied-service-info": {
+                                       "service-instance-id" : ${ar.allotted-resource-data.allotted-resource-operation-information.contrail-route-request-input.contrail-applied-service-info.service-instance-id}
+                               }
+                       }
+                       },
+                       "allotted-resource-oper-status": {
+                               "last-action": ${ar.allotted-resource-data.allotted-resource-oper-status.last-action},
+                               "modify-timestamp": ${ar.allotted-resource-data.allotted-resource-oper-status.modify-timestamp},
+                               "last-order-status": ${ar.allotted-resource-data.allotted-resource-oper-status.last-order-status},
+                               "create-timestamp": ${ar.allotted-resource-data.allotted-resource-oper-status.create-timestamp},
+                               "order-status": ${ar.allotted-resource-data.allotted-resource-oper-status.order-status},
+                               "last-rpc-action": ${ar.allotted-resource-data.allotted-resource-oper-status.last-rpc-action},
+                               "last-svc-request-id": ${ar.allotted-resource-data.allotted-resource-oper-status.last-svc-request-id}
+                       }
+               },
+               "allotted-resource-status" : {
+                       "action": ${ar.allotted-resource-status.action},
+                       "rpc-name": ${ar.allotted-resource-status.rpc-name},
+                       "rpc-action": ${ar.allotted-resource-status.rpc-action}
+               }
+        }
+}
diff --git a/ms/gra/gra-docker/src/main/templates/csm-service-instance.json b/ms/gra/gra-docker/src/main/templates/csm-service-instance.json
new file mode 100644 (file)
index 0000000..0df0df4
--- /dev/null
@@ -0,0 +1,15 @@
+{
+       "service": {
+               "service-instance-id": ${tmp.service-instance-id},
+               "service-data": {
+                       "service-information": {
+                               "global-customer-id": ${output-global-customer-id}
+                       },
+                       "service-topology": {
+                               "service-topology-identifier": {
+                                       "service-type": ${output-service-type}
+                               }
+                       }
+               }
+       }
+}
diff --git a/ms/gra/gra-docker/src/main/templates/network-instance-group-network.json b/ms/gra/gra-docker/src/main/templates/network-instance-group-network.json
new file mode 100644 (file)
index 0000000..ed44a04
--- /dev/null
@@ -0,0 +1,27 @@
+{\r
+        "network": {\r
+               "network-id": ${mdsal-nign.network[0].network-id},\r
+               "vpn-bindings": [\r
+               ${repeat:mdsal-nign.network[0].vpn-bindings_length:\r
+               {\r
+                       "vpn-binding-id": ${mdsal-nign.network[0].vpn-bindings[${1}].vpn-binding-id},\r
+                       "vpn-name": ${mdsal-nign.network[0].vpn-bindings[${1}].vpn-name},\r
+                       "global-route-target": ${mdsal-nign.network[0].vpn-bindings[${1}].global-route-target},\r
+                       "route-target-role": ${mdsal-nign.network[0].vpn-bindings[${1}].route-target-role},\r
+                       "aic-zone": ${mdsal-nign.network[0].vpn-bindings[${1}].aic-zone}\r
+               }\r
+               }\r
+               ],\r
+               "vlan-tag-id": ${mdsal-nign.network[0].vlan-tag-id},\r
+               "network-status": ${mdsal-nign.network[0].network-status},\r
+               "customer-bonding-requests": {\r
+                       "customer-bonding-request": [\r
+                       ${repeat:mdsal-nign.network[0].customer-bonding-requests.customer-bonding-request_length:\r
+                       {\r
+                               "configuration-id": ${mdsal-nign.network[0].customer-bonding-requests.customer-bonding-request[${1}].configuration-id}\r
+                       },\r
+                       }\r
+                       ]\r
+               }\r
+        }\r
+}\r
diff --git a/ms/gra/gra-docker/src/main/templates/network-level-oper-status.json b/ms/gra/gra-docker/src/main/templates/network-level-oper-status.json
new file mode 100644 (file)
index 0000000..b38a17b
--- /dev/null
@@ -0,0 +1,11 @@
+{
+       "oper-status": {
+               "order-status": ${network-level-oper-status.order-status},
+               "last-rpc-action": ${network-level-oper-status.last-rpc-action},
+               "last-action": ${network-level-oper-status.last-action},
+               "last-svc-request-id": ${network-level-oper-status.last-svc-request-id},
+               "last-order-status": ${network-level-oper-status.last-order-status},
+               "create-timestamp": ${network-level-oper-status.create-timestamp},
+               "modify-timestamp": ${network-level-oper-status.modify-timestamp}
+       }
+}
diff --git a/ms/gra/gra-docker/src/main/templates/network.json b/ms/gra/gra-docker/src/main/templates/network.json
new file mode 100644 (file)
index 0000000..88d79e5
--- /dev/null
@@ -0,0 +1,145 @@
+{
+    "network": {
+      "network-id": ${network-data.network-information.network-id},
+      "network-data": {
+        "network-provided-allotted-resources": {
+          "network-provided-ar-id": [
+${repeat:network-data.network-provided-allotted-resources.network-provided-ar-id_length:
+            ${network-data.network-provided-allotted-resources.network-provided-ar-id[${1}]},
+}
+          ]
+        },
+        "network-level-oper-status": {
+          "order-status": ${network-data.network-level-oper-status.order-status},
+          "last-rpc-action": ${network-data.network-level-oper-status.last-rpc-action},
+          "last-action": ${network-data.network-level-oper-status.last-action},
+          "last-svc-request-id": ${network-data.network-level-oper-status.last-svc-request-id},
+          "last-order-status": ${network-data.network-level-oper-status.last-order-status},
+          "create-timestamp": ${network-data.network-level-oper-status.create-timestamp},
+          "modify-timestamp": ${network-data.network-level-oper-status.modify-timestamp}
+        },
+        "sdnc-request-header": {
+          "svc-request-id": ${network-data.sdnc-request-header.svc-request-id},
+          "svc-action": ${network-data.sdnc-request-header.svc-action},
+          "svc-notification-url": ${network-data.sdnc-request-header.svc-notification-url}
+        },
+        "request-information": {
+          "request-id": ${network-data.request-information.request-id},
+          "request-action": ${network-data.request-information.request-action},
+          "source": ${network-data.request-information.source},
+          "notification-url": ${network-data.request-information.notification-url},
+          "order-number": ${network-data.request-information.order-number},
+          "order-version": ${network-data.request-information.order-version}
+        },
+        "network-request-input": {
+          "network-name": ${network-data.network-request-input.network-name},
+          "network-input-parameters": {
+            "param": [
+${repeat:network-data.network-request.network-input-parameters.param_length:
+              {
+                "name": ${network-data.network-request-inputnetwork-input-parameters.param[${1}].name},
+                "value": ${network-data.network-request-inputnetwork-input-parameters.param[${1}].value},
+                "resource-resolution-data": {
+                  "resource-key": [
+${repeat:network-data.network-request.network-input-parameters.param[${1}].resource-resolution-data.resource_key_length:
+                    {
+                      "name": ${network-data.network-request.network-input-parameters.param[${1}].resource-resolution-data.resource_key[${2}].name},
+                      "value": ${network-data.network-request.network-input-parameters.param[${1}].resource-resolution-data.resource_key[${2}].value}
+                    }
+}
+                  ],
+                  "status": ${network-data.network-request-inputnetwork-input-parameters.param[${1}].status},
+                  "capability-name": ${network-data.network-request-inputnetwork-input-parameters.param[${1}].capability-name}
+                }
+              },
+}
+            ]
+          },
+          "network-instance-group-id": ${network-data.network-request-input.network-instance-group-id},
+          "tenant": ${network-data.network-request-input.tenant},
+          "aic-cloud-region": ${network-data.network-request-input.aic-cloud-region},
+          "cloud-owner": ${network-data.network-request-input.cloud-owner},
+          "aic-clli": ${network-data.network-request-input.aic-clli}
+        },
+        "network-information": {
+          "network-id": ${network-data.network-information.network-id},
+          "network-type": ${network-data.network-information.network-type},
+          "network-technology": ${network-data.network-information.network-technology},
+          "from-preload": ${network-data.network-information.from-preload},
+          "onap-model-information": {
+            "model-invariant-uuid": ${network-data.network-topology.onap-model-information.model-invariant-uuid},
+            "model-customization-uuid": ${network-data.network-topology.onap-model-information.model-customization-uuid},
+            "model-uuid": ${network-data.network-topology.onap-model-information.model-uuid},
+            "model-version": ${network-data.network-topology.onap-model-information.model-version},
+            "model-name": ${network-data.network-topology.onap-model-information.model-name}
+          }
+        },
+        "service-information": {
+          "service-id": ${network-data.service-information.service-id},
+          "subscription-service-type": ${network-data.service-information.subscription-service-type},
+          "service-instance-id": ${network-data.service-information.service-instance-id},
+          "global-customer-id": ${network-data.service-information.global-customer-id},
+          "subscriber-name": ${network-data.service-information.subscriber-name},
+          "onap-model-information": {
+            "model-invariant-uuid": ${network-data.service-information.onap-model-information.model-invariant-uuid},
+            "model-customization-uuid": ${network-data.onap-model-information.model-customization-uuid},
+            "model-uuid": ${network-data.onap-model-information.model-uuid},
+            "model-version": ${network-data.onap-model-information.model-version},
+            "model-name": ${network-data.onap-model-information.model-name}
+          }
+        },
+        "network-topology": {
+          "tenant": ${network-data.network-topology.tenant},
+          "aic-cloud-region": ${network-data.network-topology.aic-cloud-region},
+          "cloud-owner": ${network-data.network-topology.cloud-owner},
+          "aic-clli": ${network-data.network-topology.aic-clli},
+          "network-parameters": {
+            "network-parameter": [
+${repeat:network-data.network-topology.network-parameters.network-parameter_length:
+              {
+                "network-parameter-name": ${network-data.network-topology.network-parameters.network-parameter[${1}].network-parameter-name},
+                "network-parameter-value": ${network-data.network-topology.network-parameters.network-parameter[${1}].network-parameter-value}
+              },
+}
+            ]
+          },
+          "onap-model-information": {
+            "model-invariant-uuid": ${network-data.network-topology.onap-model-information.model-invariant-uuid},
+            "model-customization-uuid": ${network-data.network-topology.onap-model-information.model-customization-uuid},
+            "model-uuid": ${network-data.network-topology.onap-model-information.model-uuid},
+            "model-version": ${network-data.network-topology.onap-model-information.model-version},
+            "model-name": ${network-data.network-topology.onap-model-information.model-name}
+          },
+          "network-assignments": {},
+          "network-topology-identifier-structure": {
+            "network-id": ${network-data.network-topology.network-topology-identifier-structure.network-id},
+            "network-name": ${network-data.network-topology.network-topology-identifier-structure.network-name},
+            "network-role": ${network-data.network-topology.network-topology-identifier-structure.network-role},
+            "network-type": ${network-data.network-topology.network-topology-identifier-structure.network-type},
+            "network-instance-group-id": ${network-data.network-topology.network-topology-identifier-structure.network-instance-group-id},
+            "network-technology": ${network-data.network-topology.network-topology-identifier-structure.network-technology},
+            "eipam-v4-address-plan": ${network-data.network-topology.network-topology-identifier-structure.eipam-v4-address-plan},
+            "eipam-v6-address-plan": ${network-data.network-topology.network-topology-identifier-structure.eipam-v6-address-plan},
+            "is-trunked": ${network-data.network-topology.network-topology-identifier-structure.is-trunked},
+            "segmentation-id": ${network-data.network-topology.network-topology-identifier-structure.segmentation-id},
+            "related-networks": {
+              "related-network": [
+${repeat:network-data.network-topology.network-topology-identifier-structure.related-networks.related-network_length:
+                {
+                  "network-id": ${network-data.network-topology.network-topology-identifier-structure.related-networks.related-network[${1}].network-id},
+                  "network-role": ${network-data.network-topology.network-topology-identifier-structure.related-networks.related-network[${1}].network-role},
+                  "vlan-tags": {
+                    "vlan-interface": ${network-data.network-topology.network-topology-identifier-structure.related-networks.related-network[${1}].vlan-tags.vlan-interface},
+                    "upper-tag-id": ${network-data.network-topology.network-topology-identifier-structure.related-networks.related-network[${1}].vlan-tags.upper-tag-id},
+                    "lower-tag-id": ${network-data.network-topology.network-topology-identifier-structure.related-networks.related-network[${1}].vlan-tags.lower-tag-id},
+                    "is-private": ${network-data.network-topology.network-topology-identifier-structure.related-networks.related-network[${1}].vlan-tags.is-private}
+                  }
+                },
+}
+              ]
+            }
+          }
+        }
+      }
+    }
+}
diff --git a/ms/gra/gra-docker/src/main/templates/port-mirror-configuration.json b/ms/gra/gra-docker/src/main/templates/port-mirror-configuration.json
new file mode 100644 (file)
index 0000000..f18d191
--- /dev/null
@@ -0,0 +1,152 @@
+{
+       "port-mirror-configuration": {
+               "configuration-id": ${pm.configuration-id},
+               "configuration-data": {
+                       "configuration-operation-information": {
+                               "sdnc-request-header": {
+                                       "svc-request-id": ${pm.configuration-data.configuration-operation-information.sdnc-request-header.svc-request-id},
+                                       "svc-action": ${pm.configuration-data.configuration-operation-information.sdnc-request-header.svc-action},
+                                       "svc-notification-url": ${pm.configuration-data.configuration-operation-information.sdnc-request-header.svc-notification-url}
+                               },
+                               "request-information": {
+                                       "request-id": ${pm.configuration-data.configuration-operation-information.request-information.request-id},
+                                       "request-action": ${pm.configuration-data.configuration-operation-information.request-information.request-action},
+                                       "source": ${pm.configuration-data.configuration-operation-information.request-information.source},
+                                       "notification-url": ${pm.configuration-data.configuration-operation-information.request-information.notification-url},
+                                       "order-number": ${pm.configuration-data.configuration-operation-information.request-information.order-number},
+                                       "order-version": ${pm.configuration-data.configuration-operation-information.request-information.order-version}
+                               },
+                               "service-information": {
+                                       "service-id": ${pm.configuration-data.configuration-operation-information.service-information.service-id},
+                                       "subscription-service-type": ${pm.configuration-data.configuration-operation-information.service-information.subscription-service-type},
+                                       "onap-model-information": {
+                                               "model-invariant-uuid": ${pm.configuration-data.configuration-operation-information.service-information.onap-model-information.model-invariant-uuid},
+                                               "model-customization-uuid": ${pm.configuration-data.configuration-operation-information.service-information.onap-model-information.model-customization-uuid},
+                                               "model-uuid": ${pm.configuration-data.configuration-operation-information.service-information.onap-model-information.model-uuid},
+                                               "model-version": ${pm.configuration-data.configuration-operation-information.service-information.onap-model-information.model-version},
+                                               "model-name": ${pm.configuration-data.configuration-operation-information.service-information.onap-model-information.model-name}
+                                       },
+                                       "service-instance-id": ${pm.configuration-data.configuration-operation-information.service-information.service-instance-id},
+                                       "global-customer-id": ${pm.configuration-data.configuration-operation-information.service-information.global-customer-id},
+                                       "subscriber-name": ${pm.configuration-data.configuration-operation-information.service-information.subscriber-name}
+                               },
+                               "configuration-information": {
+                                       "configuration-id": ${pm.configuration-data.configuration-operation-information.configuration-information.configuration-id},
+                                       "configuration-type": ${pm.configuration-data.configuration-operation-information.configuration-information.configuration-type},
+                                       "configuration-sub-type": ${pm.configuration-data.configuration-operation-information.configuration-information.configuration-sub-type},
+                                       "onap-model-information": {
+                                               "model-invariant-uuid": ${pm.configuration-data.configuration-operation-information.configuration-information.onap-model-information.model-invariant-uuid},
+                                               "model-customization-uuid": ${pm.configuration-data.configuration-operation-information.configuration-information.onap-model-information.model-customization-uuid},
+                                               "model-uuid": ${pm.configuration-data.configuration-operation-information.configuration-information.onap-model-information.model-uuid},
+                                               "model-version": ${pm.configuration-data.configuration-operation-information.configuration-information.onap-model-information.model-version},
+                                               "model-name": ${pm.configuration-data.configuration-operation-information.configuration-information.onap-model-information.model-name}
+                                       }
+                               },
+                               "port-mirror-configuration-request-input": {
+                                       "source-port": {
+                                               "sevice-instance-id": ${pm.configuration-data.configuration-operation-information.port-mirror-configuration-request-input.source-port.service-instance-id},
+                                               "vnf-information": {
+                                                       "vnf-id": ${pm.configuration-data.configuration-operation-information.port-mirror-configuration-request-input.source-port.vnf-information.vnf-id},
+                                                       "vnf-type": ${pm.configuration-data.configuration-operation-information.port-mirror-configuration-request-input.source-port.vnf-information.vnf-type}
+                                               }
+                                       },
+                                       "dest-port": {
+                                               "sevice-instance-id": ${pm.configuration-data.configuration-operation-information.port-mirror-configuration-request-input.dest-port.service-instance-id},
+                                               "vnf-information": {
+                                                       "vnf-id": ${pm.configuration-data.configuration-operation-information.port-mirror-configuration-request-input.dest-port.vnf-information.vnf-id},
+                                                       "vnf-type": ${pm.configuration-data.configuration-operation-information.port-mirror-configuration-request-input.dest-port.vnf-information.vnf-type}
+                                               },
+                                               "pnf-information": {
+                                                       "pnf-name": ${pm.configuration-data.configuration-operation-information.port-mirror-configuration-request-input.dest-port.pnf-information.pnf-name},
+                                                       "pnf-type": ${pm.configuration-data.configuration-operation-information.port-mirror-configuration-request-input.dest-port.pnf-information.pnf-type}
+                                               }
+                                       },
+                                       "tenant": ${pm.configuration-data.configuration-operation-information.port-mirror-configuration-request-input.tenant},
+                                       "aic-cloud-region": ${pm.configuration-data.configuration-operation-information.port-mirror-configuration-request-input.aic-cloud-region},
+                                       "aic-clli": ${pm.configuration-data.configuration-operation-information.port-mirror-configuration-request-input.aic-clli}
+                               }
+                       },
+                       "port-mirror-configuration-topology": {
+                               "configuration-identifiers": {
+                                       "configuration-id": ${pm.configuration-data.port-mirror-configuration-topology.configuration-identifiers.configuration-id},
+                                       "configuration-name": ${pm.configuration-data.port-mirror-configuration-topology.configuration-identifiers.configuration-name},
+                                       "configuration-type": ${pm.configuration-data.port-mirror-configuration-topology.configuration-identifiers.configuration-type},
+                                       "configuration-sub-type": ${pm.configuration-data.port-mirror-configuration-topology.configuration-identifiers.configuration-sub-type},
+                                       "parent-service-instance-id": ${pm.configuration-data.port-mirror-configuration-topology.configuration-identifiers.parent-service-instance-id}
+                               },
+                               "onap-model-information": {
+                                       "model-invariant-uuid": ${pm.configuration-data.port-mirror-configuration-topology.onap-model-information.model-invariant-uuid},
+                                       "model-customization-uuid": ${pm.configuration-data.port-mirror-configuration-topology.onap-model-information.model-customization-uuid},
+                                       "model-uuid": ${pm.configuration-data.port-mirror-configuration-topology.onap-model-information.model-uuid},
+                                       "model-version" ${pm.configuration-data.port-mirror-configuration-topology.onap-model-information.model-version},
+                                       "model-name": ${pm.configuration-data.port-mirror-configuration-topology.onap-model-information.model-name}
+                               },
+                               "port-mirror-configuration-assignments": {
+                                       "vnics-group-id": ${pm.configuration-data.port-mirror-configuration-topology.port-mirror-configuration-assignments.vnics-group-id},
+                                       "owning-entity": ${pm.configuration-data.port-mirror-configuration-topology.port-mirror-configuration-assignments.owning-entity},
+                                       "tenant-context": ${pm.configuration-data.port-mirror-configuration-topology.port-mirror-configuration-assignments.tenant-context},
+                                       "tenant": ${pm.configuration-data.port-mirror-configuration-topology.port-mirror-configuration-assignments.tenant},
+                                       "tenant-id": ${pm.configuration-data.port-mirror-configuration-topology.port-mirror-configuration-assignments.tenant-id},
+                                       "cloud-region-id": ${pm.configuration-data.port-mirror-configuration-topology.port-mirror-configuration-assignments.cloud-region-id},
+                                       "cloud-owner": ${pm.configuration-data.port-mirror-configuration-topology.port-mirror-configuration-assignments.cloud-owner},
+                                       "dest-network-fqdn": ${pm.configuration-data.port-mirror-configuration-topology.port-mirror-configuration-assignments.dest-network-fqdn},
+                                       "source-network-fqdn": ${pm.configuration-data.port-mirror-configuration-topology.port-mirror-configuration-assignments.source-network-fqdn},
+                                       "source-capacity": ${pm.configuration-data.port-mirror-configuration-topology.port-mirror-configuration-assignments.source-capacity},
+                                       "source-vnf-id": ${pm.configuration-data.port-mirror-configuration-topology.port-mirror-configuration-assignments.source-vnf-id},
+                                       "dest-vnf-id": ${pm.configuration-data.port-mirror-configuration-topology.port-mirror-configuration-assignments.dest-vnf-id},
+                                       "dest-pnf-name": ${pm.configuration-data.port-mirror-configuration-topology.port-mirror-configuration-assignments.dest-pnf-name},
+                                       "dest-p-interface": ${pm.configuration-data.port-mirror-configuration-topology.port-mirror-configuration-assignments.dest-p-interface},
+                                       "dest-pnf-port-policy-name": ${pm.configuration-data.port-mirror-configuration-topology.port-mirror-configuration-assignments.dest-pnf-port-policy-name},
+                                       "probe-type": ${pm.configuration-data.port-mirror-configuration-topology.port-mirror-configuration-assignments.probe-type},
+                                       "route-allotted-resource-id": ${pm.configuration-data.port-mirror-configuration-topology.port-mirror-configuration-assignments.route-allotted-resource-id},
+                                       "source-vnfc-instance-group-id": {
+                                               "service-instance-id": ${pm.configuration-data.port-mirror-configuration-topology.port-mirror-configuration-assignments.source-vnfc-instance-group-id.service-instance-id},
+                                               "nfc-function": ${pm.configuration-data.port-mirror-configuration-topology.port-mirror-configuration-assignments.source-vnfc-instance-group-id.nfc-function},
+                                               "instance-group-role": ${pm.configuration-data.port-mirror-configuration-topology.port-mirror-configuration-assignments.source-vnfc-instance-group-id.instance-group-role},
+                                               "configuration-id": ${pm.configuration-data.port-mirror-configuration-topology.port-mirror-configuration-assignments.source-vnfc-instance-group-id.configuration-id}
+                                       },
+                                       "dest-vnfc-instance-group-id": {
+                                               "service-instance-id": ${pm.configuration-data.port-mirror-configuration-topology.port-mirror-configuration-assignments.dest-vnfc-instance-group-id.service-instance-id},
+                                               "nfc-function": ${pm.configuration-data.port-mirror-configuration-topology.port-mirror-configuration-assignments.dest-vnfc-instance-group-id.nfc-function},
+                                               "instance-group-role": ${pm.configuration-data.port-mirror-configuration-topology.port-mirror-configuration-assignments.dest-vnfc-instance-group-id.instance-group-role},
+                                               "configuration-id": ${pm.configuration-data.port-mirror-configuration-topology.port-mirror-configuration-assignments.source-vnfc-instance-group-id.configuration-id}
+                                       },
+                                       "source-to-dest-maps": {
+                                               "source-to-dest-map": [
+               ${repeat:pm.configuration-data.port-mirror-configuration-topology.port-mirror-configuration-assignments.source-to-dest-maps.source-to-dest-map_length:
+                                                       {
+                                                       "source-port-id": ${pm.configuration-data.port-mirror-configuration-topology.port-mirror-configuration-assignments.source-to-dest-maps.source-to-dest-map[${1}].source-port-id},
+                                                       "source-port-name": ${pm.configuration-data.port-mirror-configuration-topology.port-mirror-configuration-assignments.source-to-dest-maps.source-to-dest-map[${1}].source-port-name},
+                                                       "dest-port-id": ${pm.configuration-data.port-mirror-configuration-topology.port-mirror-configuration-assignments.source-to-dest-maps.source-to-dest-map[${1}].dest-port-id},
+                                                       "dest-port-name": ${pm.configuration-data.port-mirror-configuration-topology.port-mirror-configuration-assignments.source-to-dest-maps.source-to-dest-map[${1}].dest-port-name},
+                                                       "link-name": ${pm.configuration-data.port-mirror-configuration-topology.port-mirror-configuration-assignments.source-to-dest-maps.source-to-dest-map[${1}].link-name},
+                                                       "source-vserver-id": ${pm.configuration-data.port-mirror-configuration-topology.port-mirror-configuration-assignments.source-to-dest-maps.source-to-dest-map[${1}].source-vserver-id},
+                                                       "dest-vserver-id": ${pm.configuration-data.port-mirror-configuration-topology.port-mirror-configuration-assignments.source-to-dest-maps.source-to-dest-map[${1}].dest-vserver-id},
+                                                       "dest-ip-addresses": {
+                                                               "ip-addresses": {
+                                                                       "ipv4-address": ${pm.configuration-data.port-mirror-configuration-topology.port-mirror-configuration-assignments.source-to-dest-maps.source-to-dest-map[${1}].dest-ip-addresses.ip-addresses.ipv4-address},
+                                                                       "ipv6-address": ${pm.configuration-data.port-mirror-configuration-topology.port-mirror-configuration-assignments.source-to-dest-maps.source-to-dest-map[${1}].dest-ip-addresses.ip-addresses.ipv6-address},
+                                                                       "vipv4-address": ${pm.configuration-data.port-mirror-configuration-topology.port-mirror-configuration-assignments.source-to-dest-maps.source-to-dest-map[${1}].dest-ip-addresses.ip-addresses.vipv4-address},
+                                                                       "vipv6-address": ${pm.configuration-data.port-mirror-configuration-topology.port-mirror-configuration-assignments.source-to-dest-maps.source-to-dest-map[${1}].dest-ip-addresses.ip-addresses.vipv6-address}
+                                                               }
+                                                       }
+                                                       },
+               }
+                                               ]
+                                       },
+                                       "port-mirror-configuration-instance-id": ${pm.configuration-data.port-mirror-configuration-topology.port-mirror-configuration-assignments.port-mirror-configuration-instance-id}
+                               }
+                       },
+                       "configuration-oper-status": {
+                               "order-status": ${pm.configuration-data.configuration-oper-status.order-status},
+                               "last-rpc-action": ${pm.configuration-data.configuration-oper-status.last-rpc-action},
+                               "last-action": ${pm.configuration-data.configuration-oper-status.last-action},
+                               "last-svc-request-id": ${pm.configuration-data.configuration-oper-status.last-svc-request-id},
+                               "last-order-status": ${pm.configuration-data.configuration-oper-status.last-order-status},
+                               "create-timestamp": ${pm.configuration-data.configuration-oper-status.create-timestamp},
+                               "modify-timestamp": ${pm.configuration-data.configuration-oper-status.modify-timestamp}
+                       }
+               }
+       }
+}
+
diff --git a/ms/gra/gra-docker/src/main/templates/security-zone-allotted-resource.json b/ms/gra/gra-docker/src/main/templates/security-zone-allotted-resource.json
new file mode 100644 (file)
index 0000000..afbd0bb
--- /dev/null
@@ -0,0 +1,78 @@
+{
+    "security-zone-allotted-resource": {
+               "allotted-resource-id": ${sz-ar.allotted-resource-id},
+               "allotted-resource-data": {
+                       "security-zone-topology": {
+                               "allotted-resource-identifiers": {
+                                       "consuming-service-instance-id": ${sz-ar.allotted-resource-data.security-zone-topology.allotted-resource-identifiers.consuming-service-instance-id},
+                                       "allotted-resource-name": ${sz-ar.allotted-resource-data.security-zone-topology.allotted-resource-identifiers.allotted-resource-name},
+                                       "allotted-resource-id": ${sz-ar.allotted-resource-data.security-zone-topology.allotted-resource-identifiers.allotted-resource-id},
+                                       "parent-service-instance-id": ${sz-ar.allotted-resource-data.security-zone-topology.allotted-resource-identifiers.parent-service-instance-id},
+                                       "allotted-resource-type": ${sz-ar.allotted-resource-data.security-zone-topology.allotted-resource-identifiers.allotted-resource-type}
+                               },
+                               "onap-model-information": {
+                                       "model-invariant-uuid": ${sz-ar.allotted-resource-data.security-zone-topology.onap-model-information.model-invariant-uuid},
+                                       "model-customization-uuid": ${sz-ar.allotted-resource-data.security-zone-topology.onap-model-information.model-customization-uuid},
+                                       "model-uuid": ${sz-ar.allotted-resource-data.security-zone-topology.onap-model-information.model-uuid},
+                                       "model-version": ${sz-ar.allotted-resource-data.security-zone-topology.onap-model-information.model-version}
+                               },
+                               "security-zone-assignments": {
+                                       "trusted-network-role": ${sz-ar.allotted-resource-data.security-zone-topology.security-zone-assignments.trusted-network-role},
+                                       "security-zone-name-trusted": ${sz-ar.allotted-resource-data.security-zone-topology.security-zone-assignments.security-zone-name-trusted},
+                                       "security-zone-name-untrusted": ${sz-ar.allotted-resource-data.security-zone-topology.security-zone-assignments.security-zone-name-untrusted},
+                                       "untrusted-network-role": ${sz-ar.allotted-resource-data.security-zone-topology.security-zone-assignments.untrusted-network-role},
+                                       "security-zone-service-instance-id" : ${sz-ar.allotted-resource-data.security-zone-topology.security-zone-assignments.security-zone-service-instance-id},
+                                       "security-zone-vnf-id" : ${sz-ar.allotted-resource-data.security-zone-topology.security-zone-assignments.security-zone-vnf-id},
+                                       "vlan-tag": ${sz-ar.allotted-resource-data.security-zone-topology.security-zone-assignments.vlan-tag}
+                               },
+                               "security-zone-parameters": {
+                               }
+                               
+                       },
+                       "allotted-resource-operation-information": {
+                       "allotted-resource-information": {
+                               "allotted-resource-id": ${sz-ar.allotted-resource-data.allotted-resource-operation-information.allotted-resource-information.allotted-resource-id},
+                                       "allotted-resource-type": ${sz-ar.allotted-resource-data.allotted-resource-operation-information.allotted-resource-information.allotted-resource-type},
+                                       "parent-service-instance-id": ${sz-ar.allotted-resource-data.allotted-resource-operation-information.allotted-resource-information.parent-service-instance-id},
+                                       "onap-model-information": {
+                                               "model-invariant-uuid": ${sz-ar.allotted-resource-data.allotted-resource-operation-information.allotted-resource-information.onap-model-information.model-invariant-uuid},
+                                               "model-customization-uuid": ${sz-ar.allotted-resource-data.allotted-resource-operation-information.allotted-resource-information.onap-model-information.model-customization-uuid},
+                                               "model-uuid": ${sz-ar.allotted-resource-data.allotted-resource-operation-information.allotted-resource-information.onap-model-information.model-uuid},
+                                               "model-version": ${sz-ar.allotted-resource-data.allotted-resource-operation-information.allotted-resource-information.onap-model-information.model-version}
+                               }
+                       },
+                       "sdnc-request-header": {
+                               "svc-request-id": ${sz-ar.allotted-resource-data.allotted-resource-operation-information.sdnc-request-header.svc-request-id},
+                               "svc-action": ${sz-ar.allotted-resource-data.allotted-resource-operation-information.sdnc-request-header.svc-action}
+                       },
+                               "request-information": {
+                                       "request-id": ${sz-ar.allotted-resource-data.allotted-resource-operation-information.request-information.request-id},
+                                       "source": ${sz-ar.allotted-resource-data.allotted-resource-operation-information.request-information.source},
+                                       "order-version": ${sz-ar.allotted-resource-data.allotted-resource-operation-information.request-information.order-version},
+                                       "order-number": ${sz-ar.allotted-resource-data.allotted-resource-operation-information.request-information.order-number},
+                                       "notification-url": ${sz-ar.allotted-resource-data.allotted-resource-operation-information.request-information.notification-url},
+                                       "request-action": ${sz-ar.allotted-resource-data.allotted-resource-operation-information.request-information.request-action}
+                               },
+                               "security-zone-request-input": {
+                                       "vlan-tag": ${sz-ar.allotted-resource-data.allotted-resource-operation-information.security-zone-request-input.vlan-tag},
+                                       "trusted-network-role" : ${sz-ar.allotted-resource-data.allotted-resource-operation-information.security-zone-request-input.trusted-network-role},
+                                       "untrusted-network-role" : ${sz-ar.allotted-resource-data.allotted-resource-operation-information.security-zone-request-input.untrusted-network-role}
+                       }
+                       },
+                       "allotted-resource-oper-status": {
+                               "last-action": ${sz-ar.allotted-resource-data.allotted-resource-oper-status.last-action},
+                               "modify-timestamp": ${sz-ar.allotted-resource-data.allotted-resource-oper-status.modify-timestamp},
+                               "last-order-status": ${sz-ar.allotted-resource-data.allotted-resource-oper-status.last-order-status},
+                               "create-timestamp": ${sz-ar.allotted-resource-data.allotted-resource-oper-status.create-timestamp},
+                               "order-status": ${sz-ar.allotted-resource-data.allotted-resource-oper-status.order-status},
+                               "last-rpc-action": ${sz-ar.allotted-resource-data.allotted-resource-oper-status.last-rpc-action},
+                               "last-svc-request-id": ${sz-ar.allotted-resource-data.allotted-resource-oper-status.last-svc-request-id}
+                       }
+               },
+               "allotted-resource-status" : {
+                       "action": ${sz-ar.allotted-resource-status.action},
+                       "rpc-name": ${sz-ar.allotted-resource-status.rpc-name},
+                       "rpc-action": ${sz-ar.allotted-resource-status.rpc-action}
+               }
+        }
+}
diff --git a/ms/gra/gra-docker/src/main/templates/vf-module-assign.json b/ms/gra/gra-docker/src/main/templates/vf-module-assign.json
new file mode 100644 (file)
index 0000000..ed2e4f0
--- /dev/null
@@ -0,0 +1,279 @@
+{
+    "vf-module": {
+        "vf-module-id": ${vf-module-topology-operation-input.vf-module-information.vf-module-id},
+        "vf-module-data": {
+            "sdnc-request-header": {
+                "svc-request-id": ${vf-module-data.sdnc-request-header.svc-request-id},
+                "svc-action": ${vf-module-data.sdnc-request-header.svc-action},
+                "svc-notification-url": ${vf-module-data.sdnc-request-header.svc-notification-url}
+            },
+            "request-information": {
+                "request-id": ${vf-module-data.request-information.request-id},
+                "request-action": ${vf-module-data.request-information.request-action},
+                "source": ${vf-module-data.request-information.source},
+                "notification-url": ${vf-module-data.request-information.notification-url},
+                "order-number": ${vf-module-data.request-information.order-number},
+                "order-version": ${vf-module-data.request-information.order-version}
+            },
+            "service-information": {
+                "service-id": ${vf-module-data.service-information.service-id},
+                "subscription-service-type": ${vf-module-data.service-information.subscription-service-type},
+                "onap-model-information": {
+                    "model-invariant-uuid": ${vf-module-data.service-information.onap-model-information.model-invariant-uuid},
+                    "model-customization-uuid": ${vf-module-data.service-information.onap-model-information.model-customization-uuid},
+                    "model-uuid": ${vf-module-data.service-information.onap-model-information.model-uuid},
+                    "model-version": ${vf-module-data.service-information.onap-model-information.model-version},
+                    "model-name": ${vf-module-data.service-information.onap-model-information.model-name}
+                },
+                "service-instance-id": ${vf-module-data.service-information.service-instance-id},
+                "global-customer-id": ${vf-module-data.service-information.global-customer-id},
+                "subscriber-name": ${vf-module-data.service-information.subscriber-name}
+            },
+            "vnf-information": {
+                "vnf-id": ${vf-module-data.vnf-information.vnf-id},
+                "vnf-type": ${vf-module-data.vnf-information.vnf-type},
+                "vnf-name": ${vf-module-data.vnf-information.vnf-name},
+                "onap-model-information": {
+                    "model-invariant-uuid": ${vf-module-data.vnf-information.onap-model-information.model-invariant-uuid},
+                    "model-customization-uuid": ${vf-module-data.vnf-information.onap-model-information.model-customization-uuid},
+                    "model-uuid": ${vf-module-data.vnf-information.onap-model-information.model-uuid},
+                    "model-version": ${vf-module-data.vnf-information.onap-model-information.model-version},
+                    "model-name": ${vf-module-data.vnf-information.onap-model-information.model-name}
+                }
+            },
+            "vf-module-information": {
+                "vf-module-id": ${vf-module-data.vf-module-information.vf-module-id},
+                "vf-module-type": ${vf-module-data.vf-module-information.vf-module-type},
+                               "from-preload": ${vf-module-data.vf-module-information.from-preload},
+                "onap-model-information": {
+                    "model-invariant-uuid": ${vf-module-data.vf-module-information.onap-model-information.model-invariant-uuid},
+                    "model-customization-uuid": ${vf-module-data.vf-module-information.onap-model-information.model-customization-uuid},
+                    "model-uuid": ${vf-module-data.vf-module-information.onap-model-information.model-uuid},
+                    "model-version": ${vf-module-data.vf-module-information.onap-model-information.model-version},
+                    "model-name": ${vf-module-data.vf-module-information.onap-model-information.model-name}
+                }
+            },
+            "vf-module-request-input": {
+                "request-version": ${vf-module-data.vf-module-request-input.request-version},
+                "vf-module-name": ${vf-module-data.vf-module-request-input.vf-module-name},
+                "tenant": ${vf-module-data.vf-module-request-input.tenant},
+                "aic-cloud-region": ${vf-module-data.vf-module-request-input.aic-cloud-region},
+                "aic-clli": ${vf-module-data.vf-module-request-input.aic-clli},
+                "vf-module-input-parameters": {
+                    "param": [
+${repeat:vf-module-data.vf-module-request-input.vf-module-input-parameters.param_length:
+                        {
+                            "name": ${vf-module-data.vf-module-request-input.vf-module-input-parameters.param[${1}].name},
+                            "value": ${vf-module-data.vf-module-request-input.vf-module-input-parameters.param[${1}].value}
+                        },
+}
+                    ]
+                }
+            },
+            "vf-module-topology": {
+                "vf-module-topology-identifier": {
+                    "vf-module-id": ${vf-module-data.vf-module-topology.vf-module-topology-identifier.vf-module-id},
+                    "vf-module-name": ${vf-module-data.vf-module-topology.vf-module-topology-identifier.vf-module-name},
+                    "vf-module-type": ${vf-module-data.vf-module-topology.vf-module-topology-identifier.vf-module-type}
+                },
+                "tenant": ${vf-module-data.vf-module-topology.tenant},
+                "aic-cloud-region": ${vf-module-data.vf-module-topology.aic-cloud-region},
+                "cloud-owner": ${vf-module-data.vf-module-topology.cloud-owner},
+                "aic-clli": ${vf-module-data.vf-module-topology.aic-clli},
+                "onap-model-information": {
+                    "model-invariant-uuid": ${vf-module-data.vf-module-topology.onap-model-information.model-invariant-uuid},
+                    "model-customization-uuid": ${vf-module-data.vf-module-topology.onap-model-information.model-customization-uuid},
+                    "model-uuid": ${vf-module-data.vf-module-topology.onap-model-information.model-uuid},
+                    "model-version": ${vf-module-data.vf-module-topology.onap-model-information.model-version},
+                    "model-name": ${vf-module-data.vf-module-topology.onap-model-information.model-name}
+                },
+                "vf-module-assignments": {
+                                       "vf-module-status": ${vf-module-data.vf-module-topology.vf-module-assignments.vf-module-status},
+                    "vms": {
+                        "vm": [
+${repeat:vf-module-data.vf-module-topology.vf-module-assignments.vms.vm_length:
+                            {
+                                "vm-type": ${vf-module-data.vf-module-topology.vf-module-assignments.vms.vm[${1}].vm-type},
+                                "onap-model-information": {
+                                    "model-invariant-uuid": ${vf-module-data.vf-module-topology.vf-module-assignments.vms.vm[${1}].onap-model-information.model-invariant-uuid},
+                                    "model-customization-uuid": ${vf-module-data.vf-module-topology.vf-module-assignments.vms.vm[${1}].onap-model-information.model-customization-uuid},
+                                    "model-uuid": ${vf-module-data.vf-module-topology.vf-module-assignments.vms.vm[${1}].onap-model-information.model-uuid},
+                                    "model-version": ${vf-module-data.vf-module-topology.vf-module-assignments.vms.vm[${1}].onap-model-information.model-version},
+                                    "model-name": ${vf-module-data.vf-module-topology.vf-module-assignments.vms.vm[${1}].onap-model-information.model-name}
+                                },
+                                                               "nfc-naming-code": ${vf-module-data.vf-module-topology.vf-module-assignments.vms.vm[${1}].nfc-naming-code},
+                                                               "vm-type-tag": ${vf-module-data.vf-module-topology.vf-module-assignments.vms.vm[${1}].vm-type-tag},
+                                                               "vm-count": ${vf-module-data.vf-module-topology.vf-module-assignments.vms.vm[${1}].vm-count},
+                                "vm-names": {
+                                                                       "vm-name": [
+${repeat:vf-module-data.vf-module-topology.vf-module-assignments.vms.vm[${1}].vm-names.vm-name_length:
+                                                                               ${vf-module-data.vf-module-topology.vf-module-assignments.vms.vm[${1}].vm-names.vm-name[${2}]},
+}
+                                                                       ],
+                                    "vnfc-names": [
+${repeat:vf-module-data.vf-module-topology.vf-module-assignments.vms.vm[${1}].vm-names.vnfc-names_length:
+                                        {
+                                            "vnfc-name": ${vf-module-data.vf-module-topology.vf-module-assignments.vms.vm[${1}].vm-names.vnfc-names[${2}].vnfc-name},
+                                            "vnfc-networks": {
+                                                "vnfc-network-data": [
+${repeat:vf-module-data.vf-module-topology.vf-module-assignments.vms.vm[${1}].vm-names.vnfc-names[${2}].vnfc-networks.vnfc-network-data_length:
+                                                    {
+                                                        "vnfc-network-role": ${vf-module-data.vf-module-topology.vf-module-assignments.vms.vm[${1}].vm-names.vnfc-names[${2}].vnfc-networks.vnfc-network-data[${3}].vnfc-network-role},
+                                                        "vnfc-type": ${vf-module-data.vf-module-topology.vf-module-assignments.vms.vm[${1}].vm-names.vnfc-names[${2}].vnfc-networks.vnfc-network-data[${3}].vnfc-type},
+                                                        "connection-point": {
+                                                            "connection-point-id": ${vf-module-data.vf-module-topology.vf-module-assignments.vms.vm[${1}].vm-names.vnfc-names[${2}].vnfc-networks.vnfc-network-data[${3}].connection-point.connection-point-id},
+                                                            "port-id": ${vf-module-data.vf-module-topology.vf-module-assignments.vms.vm[${1}].vm-names.vnfc-names[${2}].vnfc-networks.vnfc-network-data[${3}].connection-point.port-id},
+                                                            "vlan-data": [
+${repeat:vf-module-data.vf-module-topology.vf-module-assignments.vms.vm[${1}].vm-names.vnfc-names[${2}].vnfc-networks.vnfc-network-data[${3}].connection-point.vlan-data_length:
+                                                               {
+                                                                       "vlan-uuid": ${vf-module-data.vf-module-topology.vf-module-assignments.vms.vm[${1}].vm-names.vnfc-names[${2}].vnfc-networks.vnfc-network-data[${3}].connection-point.vlan-data[${4}].vlan-uuid},
+                                                                       "vlan-tag-id": ${vf-module-data.vf-module-topology.vf-module-assignments.vms.vm[${1}].vm-names.vnfc-names[${2}].vnfc-networks.vnfc-network-data[${3}].connection-point.vlan-data[${4}].vlan-tag-id},
+                                                                       "vlan-tag-description": ${vf-module-data.vf-module-topology.vf-module-assignments.vms.vm[${1}].vm-names.vnfc-names[${2}].vnfc-networks.vnfc-network-data[${3}].connection-point.vlan-data[${4}].vlan-tag-description},
+                                                                       "vlan-role": ${vf-module-data.vf-module-topology.vf-module-assignments.vms.vm[${1}].vm-names.vnfc-names[${2}].vnfc-networks.vnfc-network-data[${3}].connection-point.vlan-data[${4}].vlan-role}
+                                                               },
+}
+                                                               ]
+                                                       },
+                                                                                                               "vnfc-subnet": {
+                                                                                                                       "vnfc-subnet-role": ${vf-module-data.vf-module-topology.vf-module-assignments.vms.vm[${1}].vm-names.vnfc-names[${2}].vnfc-networks.vnfc-network-data[${3}].vnfc-subnet.vnfc-subnet-role},
+                                                                                                                       "vnfc-ip-assignments": [
+${repeat:vf-module-data.vf-module-topology.vf-module-assignments.vms.vm[${1}].vm-names.vnfc-names[${2}].vnfc-networks.vnfc-network-data[${3}].vnfc-subnet.vnfc-ip-assignments_length:
+                                                                                                                               {
+                                                                                                                                       "vnfc-address-family": ${vf-module-data.vf-module-topology.vf-module-assignments.vms.vm[${1}].vm-names.vnfc-names[${2}].vnfc-networks.vnfc-network-data[${3}].vnfc-subnet.vnfc-ip-assignments[${4}].vnfc-ip-assignments},
+                                                                                                                                       "vnfc-subnet-dhcp": ${vf-module-data.vf-module-topology.vf-module-assignments.vms.vm[${1}].vm-names.vnfc-names[${2}].vnfc-networks.vnfc-network-data[${3}].vnfc-subnet.vnfc-ip-assignments[${4}].vnfc-subnet-dhcp},
+                                                                                                                                       "vnfc-subnet-ip-count": ${vf-module-data.vf-module-topology.vf-module-assignments.vms.vm[${1}].vm-names.vnfc-names[${2}].vnfc-networks.vnfc-network-data[${3}].vnfc-subnet.vnfc-ip-assignments[${4}].vnfc-subnet-ip-count},
+                                                                                                                                       "vnfc-subnet-ip": [
+${repeat:vf-module-data.vf-module-topology.vf-module-assignments.vms.vm[${1}].vm-names.vnfc-names[${2}].vnfc-networks.vnfc-network-data[${3}].vnfc-subnet.vnfc-ip-assignments[${4}].vnfc-subnet-ip_length:
+                                                                                                                                               {
+                                                                                                                                                       "vnfc-ip-address": ${vf-module-data.vf-module-topology.vf-module-assignments.vms.vm[${1}].vm-names.vnfc-names[${2}].vnfc-networks.vnfc-network-data[${3}].vnfc-subnet.vnfc-ip-assignments[${4}].vnfc-subnet-ip[${5}].vnfc-ip-address},
+                                                                                                                                                       "vnfc-client-key": ${vf-module-data.vf-module-topology.vf-module-assignments.vms.vm[${1}].vm-names.vnfc-names[${2}].vnfc-networks.vnfc-network-data[${3}].vnfc-subnet.vnfc-ip-assignments[${4}].vnfc-subnet-ip[${5}].vnfc-client-key},
+                                                                                                                                                       "ip-type": ${vf-module-data.vf-module-topology.vf-module-assignments.vms.vm[${1}].vm-names.vnfc-names[${2}].vnfc-networks.vnfc-network-data[${3}].vnfc-subnet.vnfc-ip-assignments[${4}].vnfc-subnet-ip[${5}].ip-type}
+                                                                                                                                               }
+}
+                                                                                                                                               ]
+                                                                                                                               }
+}
+                                                                                                                       ]
+                                                                                                               }
+                                                                                                       },
+}
+                                                ]
+                                                                                       }
+                                                                               },
+}
+                                    ]
+                                },
+                                                               "vm-networks": {
+                                                                       "vm-network": [
+${repeat:vf-module-data.vf-module-topology.vf-module-assignments.vms.vm[${1}].vm-networks.vm-network_length:
+                                                                               {
+                                                                                       "network-role": ${vf-module-data.vf-module-topology.vf-module-assignments.vms.vm[${1}].vm-networks.vm-network[${2}].network-role},
+                                                                                       "network-role-tag": ${vf-module-data.vf-module-topology.vf-module-assignments.vms.vm[${1}].vm-networks.vm-network[${2}].network-role-tag},
+                                                                                       "network-information-items": {
+                                                                                               "network-information-item": [
+${repeat:vf-module-data.vf-module-topology.vf-module-assignments.vms.vm[${1}].vm-networks.vm-network[${2}].network-information-items.network-information-item_length:
+                                                                                                       {
+                                                                                                               "ip-version": ${vf-module-data.vf-module-topology.vf-module-assignments.vms.vm[${1}].vm-networks.vm-network[${2}].network-information-items.network-information-item[${3}].ip-version},
+                                                                                                               "use-dhcp": ${vf-module-data.vf-module-topology.vf-module-assignments.vms.vm[${1}].vm-networks.vm-network[${2}].network-information-items.network-information-item[${3}].use-dhcp},
+                                                                                                               "ip-count": ${vf-module-data.vf-module-topology.vf-module-assignments.vms.vm[${1}].vm-networks.vm-network[${2}].network-information-items.network-information-item[${3}].ip-count},
+                                                                                                               "network-ips": {
+                                                                                                                       "network-ip": [
+${repeat:vf-module-data.vf-module-topology.vf-module-assignments.vms.vm[${1}].vm-networks.vm-network[${2}].network-information-items.network-information-item[${3}].network-ips.network-ip_length:
+                                                                                                                               ${vf-module-data.vf-module-topology.vf-module-assignments.vms.vm[${1}].vm-networks.vm-network[${2}].network-information-items.network-information-item[${3}].network-ips.network-ip[${4}]},
+}
+                                                                                                                       ]
+                                                                                                               }
+                                                                                                       },
+}
+                                                                                               ]
+                                                                                       },
+                                                                                       "mac-addresses": {
+                                                                                               "mac-address": [
+${repeat:vf-module-data.vf-module-topology.vf-module-assignments.vms.vm[${1}].vm-networks.vm-network[${2}].mac-addresses.mac-address_length:
+                                                                                                       ${vf-module-data.vf-module-topology.vf-module-assignments.vms.vm[${1}].vm-networks.vm-network[${2}].mac-addresses.mac-address[${3}]},
+}
+                                                                                               ]
+                                                                                       },
+                                                                                       "floating-ips": {
+                                                                                               "floating-ip-v4": [
+${repeat:vf-module-data.vf-module-topology.vf-module-assignments.vms.vm[${1}].vm-networks.vm-network[${2}].floating-ips.floating-ip-v4_length:
+                                                                                                       ${vf-module-data.vf-module-topology.vf-module-assignments.vms.vm[${1}].vm-networks.vm-network[${2}].floating-ips.floating-ip-v4[${3}]},
+}
+                                                                                               ],
+                                                                                               "floating-ip-v6": [
+${repeat:vf-module-data.vf-module-topology.vf-module-assignments.vms.vm[${1}].vm-networks.vm-network[${2}].floating-ips.floating-ip-v6_length:
+                                                                                                       ${vf-module-data.vf-module-topology.vf-module-assignments.vms.vm[${1}].vm-networks.vm-network[${2}].floating-ips.floating-ip-v6[${3}]},
+}
+                                                                                               ]
+                                                                                       },
+                                                                                       "interface-route-prefixes": {
+                                                                                               "interface-route-prefix": [
+${repeat:vf-module-data.vf-module-topology.vf-module-assignments.vms.vm[${1}].vm-networks.vm-network[${2}].interface-route-prefixes.interface-route-prefix:
+                                                                                                       ${vf-module-data.vf-module-topology.vf-module-assignments.vms.vm[${1}].vm-networks.vm-network[${2}].interface-route-prefixes.interface-route-prefix[${3}]},
+}
+                                                                                               ]
+                                                                                       },
+                                                                                       "is-trunked": ${vf-module-data.vf-module-topology.vf-module-assignments.vms.vm[${1}].vm-networks.vm-network[${2}].is-trunked},
+                                                                                       "segmentation-id": ${vf-module-data.vf-module-topology.vf-module-assignments.vms.vm[${1}].vm-networks.vm-network[${2}].segmentation-id},
+                                                                                       "related-networks": {
+                                                                                               "related-network": [
+${repeat:vf-module-data.vf-module-topology.vf-module-assignments.vms.vm[${1}].vm-networks.vm-network[${2}].related-networks.related-network_length:
+                                                                                                       {
+                                                                                                               "network-id": ${vf-module-data.vf-module-topology.vf-module-assignments.vms.vm[${1}].vm-networks.vm-network[${2}].related-networks.related-network[${3}].network-id},
+                                                                                                               "network-role": ${vf-module-data.vf-module-topology.vf-module-assignments.vms.vm[${1}].vm-networks.vm-network[${2}].related-networks.related-network[${3}].network-role},
+                                                                                                               "vlan-tags": {
+                                                                                                                       "vlan-interface": ${vf-module-data.vf-module-topology.vf-module-assignments.vms.vm[${1}].vm-networks.vm-network[${2}].related-networks.related-network[${3}].vlan-tags.vlan-interface},
+                                                                                                                       "upper-tag-id": ${vf-module-data.vf-module-topology.vf-module-assignments.vms.vm[${1}].vm-networks.vm-network[${2}].related-networks.related-network[${3}].vlan-tags.upper-tag-id},
+                                                                                                                       "lower-tag-id": ${vf-module-data.vf-module-topology.vf-module-assignments.vms.vm[${1}].vm-networks.vm-network[${2}].related-networks.related-network[${3}].vlan-tags.lower-tag-id},
+                                                                                                                       "is-private": ${vf-module-data.vf-module-topology.vf-module-assignments.vms.vm[${1}].vm-networks.vm-network[${2}].related-networks.related-network[${3}].vlan-tags.is-private}
+                                                                                                               }
+                                                                                                       },
+}
+                                                                                               ]
+                                                                                       }
+                                                                               },
+}
+                                                                       ]
+                                                               }
+                                                       },
+}
+                        ]
+                    }
+                },
+                "vf-module-parameters": {
+                    "param": [
+${repeat:vf-module-data.vf-module-topology.vf-module-parameters.param_length:
+                        {
+                            "name": ${vf-module-data.vf-module-topology.vf-module-parameters.param[${1}].name},
+                            "value": ${vf-module-data.vf-module-topology.vf-module-parameters.param[${1}].value},
+                            "resource-resolution-data": {
+                                "resource-key": [
+${repeat:vf-module-data.vf-module-topology.vf-module-parameters.param[${1}].resource-resolution-data.resource-key_length:
+                                    {
+                                        "name": ${vf-module-data.vf-module-topology.vf-module-parameters.param[${1}].resource-resolution-data.resource-key[${2}].name},
+                                        "value": ${vf-module-data.vf-module-topology.vf-module-parameters.param[${1}].resource-resolution-data.resource-key[${2}].value}
+                                    },
+}
+                                ],
+                                "status": ${vf-module-data.vf-module-topology.vf-module-parameters.param[${1}].resource-resolution-data.status},
+                                "capability-name": ${vf-module-data.vf-module-topology.vf-module-parameters.param[${1}].resource-resolution-data.capability-name}
+                            },
+                        },
+}
+                    ]
+                },
+                "sdnc-generated-cloud-resources": ${vf-module-data.vf-module-topology.sdnc-generated-cloud-resources}
+            },
+            "vf-module-level-oper-status": {
+                "order-status": ${vf-module-data.vf-module-level-oper-status.order-status},
+                "last-rpc-action": ${vf-module-data.vf-module-level-oper-status.last-rpc-action},
+                "last-action": ${vf-module-data.vf-module-level-oper-status.last-action},
+                "last-svc-request-id": ${vf-module-data.vf-module-level-oper-status.last-svc-request-id},
+                "last-order-status": ${vf-module-data.vf-module-level-oper-status.last-order-status},
+                "create-timestamp": ${vf-module-data.vf-module-level-oper-status.create-timestamp},
+                "modify-timestamp": ${vf-module-data.vf-module-level-oper-status.modify-timestamp}
+            }
+        }
+    }
+}
+
diff --git a/ms/gra/gra-docker/src/main/templates/vnf-data-assign.json b/ms/gra/gra-docker/src/main/templates/vnf-data-assign.json
new file mode 100644 (file)
index 0000000..a58c811
--- /dev/null
@@ -0,0 +1,249 @@
+{
+    "vnf": {
+               "vnf-id": ${vnf-topology-operation-input.vnf-information.vnf-id},
+               "vnf-data": {
+                       "sdnc-request-header": {
+                               "svc-request-id": ${vnf-data.sdnc-request-header.svc-request-id},
+                               "svc-action": ${vnf-data.sdnc-request-header.svc-action},
+                               "svc-notification-url": ${vnf-data.sdnc-request-header.svc-notification-url}
+                       },
+                       "request-information": {
+                               "request-id": ${vnf-data.request-information.request-id},
+                               "request-action": ${vnf-data.request-information.request-action},
+                               "source": ${vnf-data.request-information.source},
+                               "notification-url": ${vnf-data.request-information.notification-url},
+                               "order-number": ${vnf-data.request-information.order-number},
+                               "order-version": ${vnf-data.request-information.order-version}
+                       },
+                       "service-information": {
+                               "service-id": ${vnf-data.service-information.service-id},
+                               "subscription-service-type": ${vnf-data.service-information.subscription-service-type},
+                               "onap-model-information": {
+                                       "model-invariant-uuid": ${vnf-data.service-information.onap-model-information.model-invariant-uuid},
+                                       "model-customization-uuid": ${vnf-data.service-information.onap-model-information.model-customization-uuid},
+                                       "model-uuid": ${vnf-data.service-information.onap-model-information.model-uuid},
+                                       "model-version": ${vnf-data.service-information.onap-model-information.model-version},
+                                       "model-name": ${vnf-data.service-information.onap-model-information.model-name}
+                               },
+                               "service-instance-id": ${vnf-data.service-information.service-instance-id},
+                               "global-customer-id": ${vnf-data.service-information.global-customer-id},
+                               "subscriber-name": ${vnf-data.service-information.subscriber-name}
+                       },
+                       "vnf-information": {
+                               "vnf-id": ${vnf-data.vnf-information.vnf-id},
+                               "vnf-type": ${vnf-data.vnf-information.vnf-type},
+                               "vnf-name": ${vnf-data.vnf-information.vnf-name},
+                               "onap-model-information": {
+                                       "model-invariant-uuid": ${vnf-data.vnf-information.onap-model-information.model-invariant-uuid},
+                                       "model-customization-uuid": ${vnf-data.vnf-information.onap-model-information.model-customization-uuid},
+                                       "model-uuid": ${vnf-data.vnf-information.onap-model-information.model-uuid},
+                                       "model-version": ${vnf-data.vnf-information.onap-model-information.model-version},
+                                       "model-name": ${vnf-data.vnf-information.onap-model-information.model-name}
+                               }
+                       },
+                       "vnf-request-input": {
+                               "request-version": ${vnf-data.vnf-request-input.request-version},
+                               "vnf-name": ${vnf-data.vnf-request-input.vnf-name},
+                               "tenant": ${vnf-data.vnf-request-input.tenant},
+                               "aic-cloud-region": ${vnf-data.vnf-request-input.aic-cloud-region},
+                               "cloud-owner": ${vnf-data.vnf-request-input.cloud-owner},
+                               "aic-clli": ${vnf-data.vnf-request-input.aic-clli},
+                               "vnf-networks": {
+                                       "vnf-network": [
+${repeat:vnf-data.vnf-request-input.vnf-networks.vnf-network_length:
+                                               {
+                                                       "network-role": ${vnf-data.vnf-request-input.vnf-networks.vnf-network[${1}].network-role},
+                                                       "network-name": ${vnf-data.vnf-request-input.vnf-networks.vnf-network[${1}].network-name},
+                                                       "neutron-id": ${vnf-data.vnf-request-input.vnf-networks.vnf-network[${1}].neutron-id},
+                                                       "network-id": ${vnf-data.vnf-request-input.vnf-networks.vnf-network[${1}].network-id},
+                                                       "contrail-network-fqdn": ${vnf-data.vnf-request-input.vnf-networks.vnf-network[${1}].contrail-network-fqdn},
+                                                       "subnets-data": {
+                                                               "subnet-data": [
+${repeat:vnf-data.vnf-request-input.vnf-networks.vnf-network[${1}].subnets-data.subnet-data_length:
+                                                                       {
+                                                                               "sdnc-subnet-id": ${vnf-data.vnf-request-input.vnf-networks.vnf-network[${1}].subnets-data.subnet-data[${2}].sdnc-subnet-id},
+                                                                               "subnet-role": ${vnf-data.vnf-request-input.vnf-networks.vnf-network[${1}].subnets-data.subnet-data[${2}].subnet-role},
+                                                                               "subnet-name": ${vnf-data.vnf-request-input.vnf-networks.vnf-network[${1}].subnets-data.subnet-data[${2}].subnet-name},
+                                                                               "ip-version": ${vnf-data.vnf-request-input.vnf-networks.vnf-network[${1}].subnets-data.subnet-data[${2}].ip-version},
+                                                                               "subnet-id": ${vnf-data.vnf-request-input.vnf-networks.vnf-network[${1}].subnets-data.subnet-data[${2}].subnet-id},
+                                                                               "dhcp-enabled": ${vnf-data.vnf-request-input.vnf-networks.vnf-network[${1}].subnets-data.subnet-data[${2}].dhcp-enabled},
+                                                                               "network-start-address": ${vnf-data.vnf-request-input.vnf-networks.vnf-network[${1}].subnets-data.subnet-data[${2}].network-start-address},
+                                                                               "gateway-address": ${vnf-data.vnf-request-input.vnf-networks.vnf-network[${1}].subnets-data.subnet-data[${2}].gateway-address},
+                                                                               "cidr-mask": ${vnf-data.vnf-request-input.vnf-networks.vnf-network[${1}].subnets-data.subnet-data[${2}].cidr-mask}
+                                                                       },
+}
+                                                               ]
+                                                       },
+                                                       "is-trunked": ${vnf-data.vnf-request-input.vnf-networks.vnf-network[${1}].is-trunked},
+                                                       "segmentation-id": ${vnf-data.vnf-request-input.vnf-networks.vnf-network[${1}].segmentation-id},
+                                                       "related-networks": {
+                                                               "related-network": [
+${repeat:vnf-data.vnf-request-input.vnf-networks.vnf-network[${1}].related-networks.related-network_length:
+                                                                       {
+                                                                               "network-id": ${vnf-data.vnf-request-input.vnf-networks.vnf-network[${1}].related-networks.related-network[${2}].network-id},
+                                                                               "network-role": ${vnf-data.vnf-request-input.vnf-networks.vnf-network[${1}].related-networks.related-network[${2}].network-role},
+                                                                               "vlan-tags": {
+                                                                                       "vlan-interface": ${vnf-data.vnf-request-input.vnf-networks.vnf-network[${1}].related-networks.related-network[${2}].vlan-tags.vlan-interface},
+                                                                                       "upper-tag-id": ${vnf-data.vnf-request-input.vnf-networks.vnf-network[${1}].related-networks.related-network[${2}].vlan-tags.upper-tag-id},
+                                                                                       "lower-tag-id": ${vnf-data.vnf-request-input.vnf-networks.vnf-network[${1}].related-networks.related-network[${2}].vlan-tags.lower-tag-id},
+                                                                                       "is-private": ${vnf-data.vnf-request-input.vnf-networks.vnf-network[${1}].related-networks.related-network[${2}].vlan-tags.is-private}
+                                                                               }
+                                                                       },
+}
+                                                               ]
+                                                       },
+                                               },
+}
+                                       ]
+                               },
+                               "vnf-network-instance-group-ids": [
+${repeat:vnf-data.vnf-request-input.vnf-network-instance-group-ids_length:
+                                       {
+                                               "vnf-network-instance-group-id": ${vnf-data.vnf-request-input.vnf-network-instance-group-ids[${1}].vnf-network-instance-group-id}
+                                       },
+}
+                               ],
+                               "vnf-input-parameters": {
+                                       "param": [
+${repeat:vnf-data.vnf-request-input.vnf-input-parameters.param_length:
+                                               {
+                                                       "name": ${vnf-data.vnf-request-input.vnf-input-parameters.param[${1}].name},
+                                                       "value": ${vnf-data.vnf-request-input.vnf-input-parameters.param[${1}].value}
+                                               },
+}
+                                       ]
+                               }
+                       },
+                       "vnf-topology": {
+                               "vnf-topology-identifier-structure": {
+                                       "vnf-id": ${vnf-data.vnf-topology.vnf-topology-identifier-structure.vnf-id},
+                                       "vnf-type": ${vnf-data.vnf-topology.vnf-topology-identifier-structure.vnf-type},
+                                       "nf-type": ${vnf-data.vnf-topology.vnf-topology-identifier-structure.nf-type},
+                                       "nf-role": ${vnf-data.vnf-topology.vnf-topology-identifier-structure.nf-role},
+                                       "nf-function": ${vnf-data.vnf-topology.vnf-topology-identifier-structure.nf-function},
+                                       "nf-code": ${vnf-data.vnf-topology.vnf-topology-identifier-structure.nf-code},
+                                       "vnf-name": ${vnf-data.vnf-topology.vnf-topology-identifier-structure.vnf-name},
+                               },
+                               "tenant": ${vnf-data.vnf-topology.tenant},
+                               "aic-cloud-region": ${vnf-data.vnf-topology.aic-cloud-region},
+                               "cloud-owner": ${vnf-data.vnf-topology.cloud-owner},
+                               "aic-clli": ${vnf-data.vnf-topology.aic-clli},
+                               "onap-model-information": {
+                                       "model-invariant-uuid": ${vnf-data.vnf-topology.onap-model-information.model-invariant-uuid},
+                                       "model-customization-uuid": ${vnf-data.vnf-topology.onap-model-information.model-customization-uuid},
+                                       "model-uuid": ${vnf-data.vnf-topology.onap-model-information.model-uuid},
+                                       "model-version": ${vnf-data.vnf-topology.onap-model-information.model-version},
+                                       "model-name": ${vnf-data.vnf-topology.onap-model-information.model-name},
+                               },
+                               "vnf-resource-assignments": {
+                                       "vnf-status": ${vnf-data.vnf-topology.vnf-resource-assignments.vnf-status},
+                                       "availability-zones": {
+                                               "availability-zone": [
+${repeat:vnf-data.vnf-topology.vnf-resource-assignments.availability-zones.availability-zone_length:
+                                                       ${vnf-data.vnf-topology.vnf-resource-assignments.availability-zones.availability-zone[${1}]},
+}
+                                               ]
+                                       },
+                                       "vnf-networks": {
+                                               "vnf-network": [
+${repeat:vnf-data.vnf-topology.vnf-resource-assignments.vnf-networks.vnf-network_length:
+                                                       {
+                                                               "network-role": ${vnf-data.vnf-topology.vnf-resource-assignments.vnf-networks.vnf-network[${1}].network-role},
+                                                               "network-name": ${vnf-data.vnf-topology.vnf-resource-assignments.vnf-networks.vnf-network[${1}].network-name},
+                                                               "neutron-id": ${vnf-data.vnf-topology.vnf-resource-assignments.vnf-networks.vnf-network[${1}].neutron-id},
+                                                               "network-id": ${vnf-data.vnf-topology.vnf-resource-assignments.vnf-networks.vnf-network[${1}].network-id},
+                                                               "contrail-network-fqdn": ${vnf-data.vnf-topology.vnf-resource-assignments.vnf-networks.vnf-network[${1}].contrail-network-fqdn},
+                                                               "subnets-data": {
+                                                                       "subnet-data": [
+${repeat:vnf-data.vnf-topology.vnf-resource-assignments.vnf-networks.vnf-network[${1}].subnets-data.subnet-data_length:
+                                                                               {
+                                                                                       "sdnc-subnet-id": ${vnf-data.vnf-topology.vnf-resource-assignments.vnf-networks.vnf-network[${1}].subnets-data.subnet-data[${2}].sdnc-subnet-id},
+                                                                                       "subnet-role": ${vnf-data.vnf-topology.vnf-resource-assignments.vnf-networks.vnf-network[${1}].subnets-data.subnet-data[${2}].subnet-role},
+                                                                                       "subnet-name": ${vnf-data.vnf-topology.vnf-resource-assignments.vnf-networks.vnf-network[${1}].subnets-data.subnet-data[${2}].subnet-name},
+                                                                                       "ip-version": ${vnf-data.vnf-topology.vnf-resource-assignments.vnf-networks.vnf-network[${1}].subnets-data.subnet-data[${2}].ip-version},
+                                                                                       "subnet-id": ${vnf-data.vnf-topology.vnf-resource-assignments.vnf-networks.vnf-network[${1}].subnets-data.subnet-data[${2}].subnet-id},
+                                                                                       "dhcp-enabled": ${vnf-data.vnf-topology.vnf-resource-assignments.vnf-networks.vnf-network[${1}].subnets-data.subnet-data[${2}].dhcp-enabled},
+                                                                                       "network-start-address": ${vnf-data.vnf-topology.vnf-resource-assignments.vnf-networks.vnf-network[${1}].subnets-data.subnet-data[${2}].network-start-address},
+                                                                                       "gateway-address": ${vnf-data.vnf-topology.vnf-resource-assignments.vnf-networks.vnf-network[${1}].subnets-data.subnet-data[${2}].gateway-address},
+                                                                                       "cidr-mask": ${vnf-data.vnf-topology.vnf-resource-assignments.vnf-networks.vnf-network[${1}].subnets-data.subnet-data[${2}].cidr-mask}
+                                                                               },
+}
+                                                                       ]
+                                                               },
+                                                               "is-trunked": ${vnf-data.vnf-topology.vnf-resource-assignments.vnf-networks.vnf-network[${1}].is-trunked},
+                                                               "segmentation-id": ${vnf-data.vnf-topology.vnf-resource-assignments.vnf-networks.vnf-network[${1}].segmentation-id},
+                                                               "related-networks": {
+                                                                       "related-network": [
+${repeat:vnf-data.vnf-topology.vnf-resource-assignments.vnf-networks.vnf-network[${1}].related-networks.related-network_length:
+                                                                               {
+                                                                                       "network-id": ${vnf-data.vnf-topology.vnf-resource-assignments.vnf-networks.vnf-network[${1}].related-networks.related-network[${2}].network-id},
+                                                                                       "network-role": ${vnf-data.vnf-topology.vnf-resource-assignments.vnf-networks.vnf-network[${1}].related-networks.related-network[${2}].network-role},
+                                                                                       "vlan-tags": {
+                                                                                               "vlan-interface": ${vnf-data.vnf-topology.vnf-resource-assignments.vnf-networks.vnf-network[${1}].related-networks.related-network[${2}].vlan-tags.vlan-interface},
+                                                                                               "upper-tag-id": ${vnf-data.vnf-topology.vnf-resource-assignments.vnf-networks.vnf-network[${1}].related-networks.related-network[${2}].vlan-tags.upper-tag-id},
+                                                                                               "lower-tag-id": ${vnf-data.vnf-topology.vnf-resource-assignments.vnf-networks.vnf-network[${1}].related-networks.related-network[${2}].vlan-tags.lower-tag-id},
+                                                                                               "is-private": ${vnf-data.vnf-topology.vnf-resource-assignments.vnf-networks.vnf-network[${1}].related-networks.related-network[${2}].vlan-tags.is-private}
+                                                                                       }
+                                                                               },
+}
+                                                                       ]
+                                                               }
+                                                       },
+}
+                                               ]
+                                       }
+                               },
+                               "vnf-parameters-data": {
+                                       "param": [
+${repeat:vnf-data.vnf-topology.vnf-parameters-data.param_length:
+                                               {
+                                                       "name": ${vnf-data.vnf-topology.vnf-parameters-data.param[${1}].name},
+                                                       "value": ${vnf-data.vnf-topology.vnf-parameters-data.param[${1}].value}
+                                               },
+}
+                                       ]
+                               },
+                               "sdnc-generated-cloud-resources": ${vnf-data.vnf-topology.sdnc-generated-cloud-resources},
+                       },
+                       "vnf-network-collections": {
+                               "vnf-network-collection": [
+${repeat:vnf-data.vnf-network-collections.vnf-network-collection_length:
+                                       {
+                                               "network-instance-group-function": ${vnf-data.vnf-network-collections.vnf-network-collection[${1}].network-instance-group-function},
+                                               "network-instance-group-id": ${vnf-data.vnf-network-collections.vnf-network-collection[${1}].network-instance-group-id},
+                                               "network-collection-service-instance-id": ${vnf-data.vnf-network-collections.vnf-network-collection[${1}].network-collection-service-instance-id},
+                                               "network-collection-customization-uuid": ${vnf-data.vnf-network-collections.vnf-network-collection[${1}].network-collection-customization-uuid},
+                                               "networks": {
+                                                       "network": [
+${repeat:vnf-data.vnf-network-collections.vnf-network-collection[${1}].networks.network_length:
+                                                               {
+                                                                       "network-id": ${vnf-data.vnf-network-collections.vnf-network-collection[${1}].networks.network[${2}].network-id},
+                                                                       "neutron-network-id": ${vnf-data.vnf-network-collections.vnf-network-collection[${1}].networks.network[${2}].neutron-network-id}
+                                                               },
+}
+                                                       ]
+                                               },
+                                               "vnf-floating-ip": {
+                                                       "ip-addresses": {
+                                                               "ipv4-address": ${vnf-data.vnf-network-collections.vnf-network-collection[${1}].vnf-floating-ip.ip-addresses.ipv4-address},
+                                                               "ipv6-address": ${vnf-data.vnf-network-collections.vnf-network-collection[${1}].vnf-floating-ip.ip-addresses.ipv6-address},
+                                                               "vipv4-address": ${vnf-data.vnf-network-collections.vnf-network-collection[${1}].vnf-floating-ip.ip-addresses.vipv4-address},
+                                                               "vipv6-address": ${vnf-data.vnf-network-collections.vnf-network-collection[${1}].vnf-floating-ip.ip-addresses.vipv6-address}
+                                                       }
+                                               }
+                                       },
+}
+                               ]
+                       },
+                       "vnf-level-oper-status": {
+                               "order-status": ${vnf-data.vnf-level-oper-status.order-status},
+                               "last-rpc-action": ${vnf-data.vnf-level-oper-status.last-rpc-action},
+                               "last-action": ${vnf-data.vnf-level-oper-status.last-action},
+                               "last-svc-request-id": ${vnf-data.vnf-level-oper-status.last-svc-request-id},
+                               "last-order-status": ${vnf-data.vnf-level-oper-status.last-order-status},
+                               "create-timestamp": ${vnf-data.vnf-level-oper-status.create-timestamp},
+                               "modify-timestamp": ${vnf-data.vnf-level-oper-status.modify-timestamp}
+                       }
+               }
+    }
+}
diff --git a/ms/gra/gra-docker/src/main/templates/vnf-level-oper-status.json b/ms/gra/gra-docker/src/main/templates/vnf-level-oper-status.json
new file mode 100644 (file)
index 0000000..6f80b46
--- /dev/null
@@ -0,0 +1,12 @@
+{
+       "oper-status": {
+               "order-status": ${vnf-level-oper-status.order-status},
+               "last-rpc-action": ${vnf-level-oper-status.last-rpc-action},
+               "last-action": ${vnf-level-oper-status.last-action},
+               "last-svc-request-id": ${vnf-level-oper-status.last-svc-request-id},
+               "last-order-status": ${vnf-level-oper-status.last-order-status},
+               "create-timestamp": ${vnf-level-oper-status.create-timestamp},
+               "modify-timestamp": ${vnf-level-oper-status.modify-timestamp}
+       }
+}
+
diff --git a/ms/gra/gra-docker/src/main/templates/vnf-network.json b/ms/gra/gra-docker/src/main/templates/vnf-network.json
new file mode 100644 (file)
index 0000000..8fbf755
--- /dev/null
@@ -0,0 +1,45 @@
+{
+    "vnf-network": {
+        "network-role": ${vnf-network-data.network-role},
+        "network-name": ${vnf-network-data.network-name},
+        "neutron-id": ${vnf-network-data.neutron-id},
+        "network-id": ${vnf-network-data.network-id},
+        "contrail-network-fqdn": ${vnf-network-data.contrail-network-fqdn},
+               "subnets-data": {
+                       "subnet-data": [
+${repeat:vnf-network-data.subnets-data.subnet-data_length:
+                               {
+                                       "sdnc-subnet-id": ${vnf-network-data.subnets-data.subnet-data[${1}].sdnc-subnet-id},
+                                       "subnet-role": ${vnf-network-data.subnets-data.subnet-data[${1}].subnet-role},
+                                       "subnet-name": ${vnf-network-data.subnets-data.subnet-data[${1}].subnet-name},
+                                       "ip-version": ${vnf-network-data.subnets-data.subnet-data[${1}].ip-version},
+                                       "subnet-id": ${vnf-network-data.subnets-data.subnet-data[${1}].subnet-id},
+                                       "dhcp-enabled": ${vnf-network-data.subnets-data.subnet-data[${1}].dhcp-enabled},
+                                       "network-start-address": ${vnf-network-data.subnets-data.subnet-data[${1}].network-start-address},
+                                       "gateway-address": ${vnf-network-data.subnets-data.subnet-data[${1}].gateway-address},
+                                       "cidr-mask": ${vnf-network-data.subnets-data.subnet-data[${1}].cidr-mask}
+                               },
+}
+                       ]
+               },
+               "is-trunked": ${vnf-network-data.is-trunked},
+        "segmentation-id": ${vnf-network-data.segmentation-id},
+               "related-networks": {
+                       "related-network": [
+${repeat:vnf-network-data.related-networks.related-network_length:
+                               {
+                                       "network-id": ${vnf-network-data.related-networks.related-network[${1}].network-id},
+                                       "network-role": ${vnf-network-data.related-networks.related-network[${1}].network-role},
+                                       "vlan-tags": {
+                                               "vlan-interface": ${vnf-network-data.related-networks.related-network[${1}].vlan-tags.vlan-interface},
+                                               "upper-tag-id": ${vnf-network-data.related-networks.related-network[${1}].vlan-tags.upper-tag-id},
+                                               "lower-tag-id": ${vnf-network-data.related-networks.related-network[${1}].vlan-tags.lower-tag-id},
+                                               "is-private": ${vnf-network-data.related-networks.related-network[${1}].vlan-tags.is-private}
+                                       }
+                               },
+}
+                       ]
+               }
+    }
+}
+
index e36f8b9..56b8e39 100644 (file)
@@ -18,6 +18,7 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  -->
+
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
 
     <description>Generic Resource API microservice</description>
     
     <properties>
-        <aaf.cadi.version>2.1.21</aaf.cadi.version>
-        <ccsdk.apps.version>1.3.0-SNAPSHOT</ccsdk.apps.version>
-        <ccsdk.docker.version>1.2-STAGING-latest</ccsdk.docker.version>
-        <sdnc.northbound.version>2.3.0-SNAPSHOT</sdnc.northbound.version>
-        <sdnc.oam.version>2.3.0-SNAPSHOT</sdnc.oam.version>
         <gratest.mysql.database>testdb</gratest.mysql.database>
         <gratest.mysql.root.password>itsASecret</gratest.mysql.root.password>
         <gratest.mysql.user>testdb</gratest.mysql.user>
index 67a9565..ab8cd69 100644 (file)
@@ -18,6 +18,7 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  -->
+
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
 
@@ -27,6 +28,7 @@
         <version>2.3.0-SNAPSHOT</version>
     </parent>
 
+    <!-- Unnecessary comment to test generated jobs from PR -->
     <artifactId>sdnc-apps-ms</artifactId>
     <version>2.3.0-SNAPSHOT</version>
     <packaging>pom</packaging>
@@ -35,6 +37,7 @@
     <description>Micro-services</description>
 
     <modules>
+        <module>sanity-test</module>
         <module>gra</module>
     </modules>
 </project>
diff --git a/ms/sanity-test/pom.xml b/ms/sanity-test/pom.xml
new file mode 100644 (file)
index 0000000..d588798
--- /dev/null
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+ * ============LICENSE_START=======================================================
+ * ONAP : CCSDK.apps
+ * ================================================================================
+ * Copyright (C) 2018 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.onap.sdnc.apps</groupId>
+        <artifactId>sdnc-apps-ms</artifactId>
+        <version>2.3.0-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>sanity-test</artifactId>
+    <version>2.3.0-SNAPSHOT</version>
+    <packaging>pom</packaging>
+
+    <name>sdnc-apps :: ms :: ${project.artifactId}</name>
+    <description>Sanity test microservice</description>
+
+    <modules>
+        <module>sanity-test-app</module>
+    </modules>
+</project>
diff --git a/ms/sanity-test/sanity-test-app/.swagger-codegen-ignore b/ms/sanity-test/sanity-test-app/.swagger-codegen-ignore
new file mode 100644 (file)
index 0000000..1ed686e
--- /dev/null
@@ -0,0 +1,4 @@
+**/OperationsApiController.java
+**/OperationalApiController.java
+**/ConfigApiController.java
+**/Swagger2SpringBoot.java
\ No newline at end of file
diff --git a/ms/sanity-test/sanity-test-app/pom.xml b/ms/sanity-test/sanity-test-app/pom.xml
new file mode 100644 (file)
index 0000000..9c273af
--- /dev/null
@@ -0,0 +1,311 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.onap.sdnc.apps</groupId>
+        <artifactId>sanity-test</artifactId>
+        <version>2.3.0-SNAPSHOT</version>
+    </parent>
+
+    <groupId>org.onap.sdnc.apps</groupId>
+    <artifactId>sanity-test-app</artifactId>
+    <version>2.3.0-SNAPSHOT</version>
+    <packaging>jar</packaging>
+
+    <name>sdnc-apps :: ms :: sanity-test :: ${project.artifactId}</name>
+    <description>Sanity Test API application</description>
+    <url>http://wiki.onap.org</url>
+
+    <properties>
+        <start-class>org.onap.sdnc.apps.ms.sanitytest.SanityTestMs</start-class>
+        <liquibase.properties>${project.basedir}/src/main/resources/liquibase.properties</liquibase.properties>
+        <maven.compiler.source>1.11</maven.compiler.source>
+        <maven.compiler.target>1.11</maven.compiler.target>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>io.swagger</groupId>
+            <artifactId>swagger-annotations</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.springframework.boot</groupId>
+                    <artifactId>spring-boot-starter-logging</artifactId>
+                </exclusion>
+            </exclusions>
+               </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-log4j2</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.fasterxml.jackson.dataformat</groupId>
+            <artifactId>jackson-dataformat-xml</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.onap.aaf.authz</groupId>
+            <artifactId>aaf-auth-client</artifactId>
+            <version>${aaf.cadi.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.onap.aaf.authz</groupId>
+            <artifactId>aaf-cadi-aaf</artifactId>
+            <version>${aaf.cadi.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.onap.aaf.authz</groupId>
+            <artifactId>aaf-misc-env</artifactId>
+            <version>${aaf.cadi.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.onap.aaf.authz</groupId>
+            <artifactId>aaf-misc-rosetta</artifactId>
+            <version>${aaf.cadi.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-jpa</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-validation</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-actuator</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>io.springfox</groupId>
+            <artifactId>springfox-swagger2</artifactId>
+            <version>3.0.0</version>
+        </dependency>
+        <dependency>
+            <groupId>io.springfox</groupId>
+            <artifactId>springfox-swagger-ui</artifactId>
+            <version>3.0.0</version>
+        </dependency>
+        <dependency>
+            <groupId>org.onap.ccsdk.apps</groupId>
+            <artifactId>services</artifactId>
+            <version>${ccsdk.apps.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.onap.ccsdk.sli.core</groupId>
+            <artifactId>sli-common</artifactId>
+            <version>${ccsdk.sli.core.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.onap.ccsdk.sli.core</groupId>
+            <artifactId>sli-provider-base</artifactId>
+            <version>${ccsdk.sli.core.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.onap.logging-analytics</groupId>
+            <artifactId>logging-filter-spring</artifactId>
+            <version>1.6.6</version>
+        </dependency>
+        <dependency>
+            <groupId>javax.ws.rs</groupId>
+            <artifactId>javax.ws.rs-api</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.onap.ccsdk.sli.core</groupId>
+            <artifactId>sliPluginUtils-provider</artifactId>
+            <version>${ccsdk.sli.core.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.onap.ccsdk.sli.adaptors</groupId>
+            <artifactId>mdsal-resource-provider</artifactId>
+            <version>${ccsdk.sli.adaptors.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.onap.ccsdk.sli.adaptors.messagerouter</groupId>
+            <artifactId>publisher.provider</artifactId>
+            <version>${ccsdk.sli.adaptors.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.onap.ccsdk.sli.adaptors</groupId>
+            <artifactId>netbox-client-provider</artifactId>
+            <version>${ccsdk.sli.adaptors.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.onap.ccsdk.sli.adaptors</groupId>
+            <artifactId>sql-resource-provider</artifactId>
+            <version>${ccsdk.sli.adaptors.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.onap.ccsdk.sli.plugins</groupId>
+            <artifactId>restapi-call-node-provider</artifactId>
+            <version>${ccsdk.sli.plugins.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.onap.ccsdk.sli.plugins</groupId>
+            <artifactId>properties-node-provider</artifactId>
+            <version>${ccsdk.sli.plugins.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.liquibase</groupId>
+            <artifactId>liquibase-core</artifactId>
+            <version>4.3.0</version>
+        </dependency>
+
+        <!-- this jersey jar is needed for rest api call node to function properly -->
+        <dependency>
+            <groupId>org.glassfish.jersey.inject</groupId>
+            <artifactId>jersey-hk2</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.google.code.gson</groupId>
+            <artifactId>gson</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.derby</groupId>
+            <artifactId>derby</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <!-- Necessary to run tests with coverage in IntelliJ -->
+        <dependency>
+            <groupId>org.junit.platform</groupId>
+            <artifactId>junit-platform-launcher</artifactId>
+            <version>1.6.2</version>
+            <scope>test</scope>
+        </dependency>
+
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-dependency-plugin</artifactId>
+                <version>3.0.2</version>
+
+                <executions>
+                    <!-- DGs are needed for unit tests as well -->
+                    <execution>
+                        <id>unpack dgs</id>
+                        <phase>generate-sources</phase>
+                        <goals>
+                            <goal>unpack</goal>
+                        </goals>
+                        <configuration>
+                            <outputDirectory>${basedir}/target</outputDirectory>
+                            <artifactItems>
+                                <artifactItem>
+                                    <groupId>org.onap.sdnc.oam</groupId>
+                                    <artifactId>platform-logic-installer</artifactId>
+                                    <version>${sdnc.oam.version}</version>
+                                    <type>zip</type>
+                                </artifactItem>
+                            </artifactItems>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>io.swagger</groupId>
+                <artifactId>swagger-codegen-maven-plugin</artifactId>
+                <version>2.3.1</version>
+                <executions>
+                    <execution>
+                        <phase>generate-sources</phase>
+                        <goals>
+                            <goal>generate</goal>
+                        </goals>
+                        <configuration>
+                            <output>target/generated-sources</output>
+                            <inputSpec>${project.basedir}/src/main/yaml/sanitytest-api.yaml</inputSpec>
+                            <language>spring</language>
+                            <apiPackage>org.onap.sdnc.apps.ms.sanitytest.swagger</apiPackage>
+                            <modelPackage>org.onap.sdnc.apps.ms.sanitytest.swagger.model</modelPackage>
+                            <invokerPackage>org.onap.sdnc.apps.ms.sanitytest.swagger</invokerPackage>
+                            <generateApis>true</generateApis>
+                            <generateApiTests>true</generateApiTests>
+                            <ignoreFileOverride>${project.basedir}/.swagger-codegen-ignore</ignoreFileOverride>
+                            <withXml>true</withXml>
+                            <templateDirectory>${project.basedir}/src/main/templates</templateDirectory>
+                            <configOptions>
+                                <java8>true</java8>
+                                <springBootVersion>2.2.4-RELEASE</springBootVersion>
+                            </configOptions>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <configuration>
+                    <classifier>exec</classifier>
+                </configuration>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>repackage</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.codehaus.mojo</groupId>
+                <artifactId>build-helper-maven-plugin</artifactId>
+                <version>3.0.0</version>
+                <executions>
+                    <execution>
+                        <id>addSource</id>
+                        <phase>generate-sources</phase>
+                        <goals>
+                            <goal>add-source</goal>
+                        </goals>
+                        <configuration>
+                            <sources>
+                                <source>${project.basedir}/target/generated-sources/src/main/java</source>
+                            </sources>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-surefire-plugin</artifactId>
+                <version>2.19.1</version>
+                <configuration>
+                    <environmentVariables>
+                        <SDNC_CONFIG_DIR>${basedir}/src/test/resources</SDNC_CONFIG_DIR>
+                        <SVCLOGIC_PROPERTIES>${basedir}/src/test/resources/svclogic.properties</SVCLOGIC_PROPERTIES>
+                        <MYSQL_DATABASE>${gratest.mysql.database}</MYSQL_DATABASE>
+                        <MYSQL_USER>${gratest.mysql.user}</MYSQL_USER>
+                        <MYSQL_PASSWORD>${gratest.mysql.password}</MYSQL_PASSWORD>
+                    </environmentVariables>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-failsafe-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>integration-test</goal>
+                            <goal>verify</goal>
+                        </goals>
+                    </execution>
+                </executions>
+                <configuration>
+                    <skipITs>true</skipITs>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+</project>
diff --git a/ms/sanity-test/sanity-test-app/src/main/java/org/onap/sdnc/apps/ms/sanitytest/controllers/SanityTestOperationsApi.java b/ms/sanity-test/sanity-test-app/src/main/java/org/onap/sdnc/apps/ms/sanitytest/controllers/SanityTestOperationsApi.java
new file mode 100644 (file)
index 0000000..d1b7233
--- /dev/null
@@ -0,0 +1,164 @@
+package org.onap.sdnc.apps.ms.sanitytest.controllers;
+
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Optional;
+import java.util.Properties;
+import java.util.TimeZone;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.validation.Valid;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import org.onap.ccsdk.apps.services.RestException;
+import org.onap.ccsdk.apps.services.SvcLogicFactory;
+import org.onap.ccsdk.sli.core.sli.SvcLogicContext;
+import org.onap.ccsdk.sli.core.sli.SvcLogicException;
+import org.onap.ccsdk.sli.core.sli.SvcLogicLoader;
+import org.onap.ccsdk.sli.core.sli.provider.base.SvcLogicServiceBase;
+import org.onap.sdnc.apps.ms.sanitytest.swagger.OperationsApi;
+import org.onap.sdnc.apps.ms.sanitytest.swagger.model.SanitytestApiInputBodyparam;
+import org.onap.sdnc.apps.ms.sanitytest.swagger.model.SanitytestApiRequestInformation;
+import org.onap.sdnc.apps.ms.sanitytest.swagger.model.SanitytestApiResponseField;
+import org.onap.sdnc.apps.ms.sanitytest.swagger.model.SanitytestApiResponseFields;
+import org.onap.sdnc.apps.ms.sanitytest.swagger.model.SanitytestApiResultEnumeration;
+import org.onap.sdnc.apps.ms.sanitytest.swagger.model.SanitytestApiServiceConfigurationOperation;
+import org.onap.sdnc.apps.ms.sanitytest.swagger.model.SanitytestApiTestListItem;
+import org.onap.sdnc.apps.ms.sanitytest.swagger.model.SanitytestApiTestNameEnumeration;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Import;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Controller;
+
+@Controller
+@ComponentScan(basePackages = { "org.onap.sdnc.apps.ms.sanitytest.*", "org.onap.ccsdk.apps.services" })
+@Import(value = SvcLogicFactory.class)
+public class SanityTestOperationsApi implements OperationsApi 
+{
+
+    private static final String MODULE_NAME = "SANITYTEST-API";
+
+    private final ObjectMapper objectMapper;
+
+    private final HttpServletRequest request;
+
+    @Autowired
+    protected SvcLogicServiceBase svc;
+
+    @Autowired
+    protected SvcLogicLoader svcLogicLoader;
+
+    private static class Iso8601Util {
+
+        private static TimeZone timeZone = TimeZone.getTimeZone("UTC");
+        private static DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
+
+        private Iso8601Util() {
+        }
+
+        static {
+            dateFormat.setTimeZone(timeZone);
+        }
+
+        private static String now() {
+            return dateFormat.format(new Date());
+        }
+    }
+
+    @org.springframework.beans.factory.annotation.Autowired
+    public SanityTestOperationsApi(ObjectMapper objectMapper, HttpServletRequest request) {
+        this.objectMapper = objectMapper;
+        this.request = request;
+    }
+
+
+    @Override
+    public Optional<ObjectMapper> getObjectMapper() {
+        return Optional.ofNullable(objectMapper);
+    }
+
+    @Override
+    public Optional<HttpServletRequest> getRequest() {
+        return Optional.ofNullable(request);
+    }
+
+    @Override
+    public ResponseEntity<SanitytestApiServiceConfigurationOperation> operationsSANITYTESTAPIserviceConfigurationOperationPost(
+            @Valid SanitytestApiInputBodyparam input) throws RestException {
+        final String svcOperation = "service-configuration-operation";
+        SanitytestApiRequestInformation reqInfo = input.getInput().getRequestInformation();
+        List<SanitytestApiTestListItem> testList = reqInfo.getTestList();
+        SanitytestApiServiceConfigurationOperation retval = new SanitytestApiServiceConfigurationOperation();
+        SanitytestApiResponseFields resp = new SanitytestApiResponseFields();
+
+
+        SvcLogicContext ctxIn = new SvcLogicContext();
+
+
+        // Add input to SvcLogicContext
+        try {
+            ctxIn.mergeJson(svcOperation + "-input", objectMapper.writeValueAsString(input.getInput()));
+        } catch (JsonProcessingException e) {
+            log.error("Caught exception trying to save input to SvcLogicContext", e);
+            return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
+        }
+
+        // Call DG
+        try {
+            // Any of these can throw a nullpointer exception
+            // execute should only throw a SvcLogicException
+            SvcLogicContext ctxOut = svc.execute(MODULE_NAME, svcOperation, null, "sync", ctxIn);
+            Properties respProps = ctxOut.toProperties();
+
+            String errCode = respProps.getProperty("error-code", "200");
+
+            if ("200".equals(errCode)) {
+                // DG returns success - return test results.
+
+
+                int testcount = Integer.parseInt(respProps.getProperty("service-configuration-operation-output.response-information.response-test-list_length"));
+                for (int i = 0; i < testcount; i++) {
+                    SanitytestApiResponseField respItem = new SanitytestApiResponseField();
+                    SanitytestApiTestListItem testItem = testList.get(i);
+                    respItem.setResponseTestNumber(testItem.getTestNumber());
+                    String testName = respProps.getProperty("service-configuration-operation-output.response-information.response-test-list["
+                                           + i + "].response-test-name");
+                    respItem.setResponseTestName(SanitytestApiTestNameEnumeration.fromValue(testName));
+                    respItem.setStartTime(respProps.getProperty("service-configuration-operation-output.response-information.response-test-list["
+                        + i + "].start-time"));
+                    respItem.setEndTime(respProps.getProperty("service-configuration-operation-output.response-information.response-test-list["
+                        + i + "].end-time"));
+                    respItem.setElapsedTime(respProps.getProperty("service-configuration-operation-output.response-information.response-test-list["
+                            + i + "].elapsed-time"));
+                    respItem.setErrorMessage(respProps.getProperty("service-configuration-operation-output.response-information.response-test-list["
+                            + i + "].error-message"));
+                    respItem.setResult(SanitytestApiResultEnumeration.fromValue(respProps.getProperty("service-configuration-operation-output.response-information.response-test-list["
+                            + i + "].result")));
+                    resp.addResponseInformationItem(respItem);
+                }
+                log.info("Returned SUCCESS for " + svcOperation);
+                retval.setOutput(resp);
+                return new ResponseEntity<> (retval, HttpStatus.OK);
+            } else {
+                return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
+            }
+
+        } catch (NullPointerException npe) {
+            log.error("Caught NPE", npe);
+            return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
+        } catch (SvcLogicException e) {
+            log.error("Caught SvcLogicException", e);
+            return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
+        }
+    }
+
+
+    
+}
diff --git a/ms/sanity-test/sanity-test-app/src/main/templates/api.mustache b/ms/sanity-test/sanity-test-app/src/main/templates/api.mustache
new file mode 100644 (file)
index 0000000..c28642c
--- /dev/null
@@ -0,0 +1,136 @@
+/**
+* NOTE: This class is auto generated by the swagger code generator program ({{{generatorVersion}}}).
+* https://github.com/swagger-api/swagger-codegen
+* Do not edit the class manually.
+*/
+package {{package}};
+
+{{#imports}}import {{import}};
+{{/imports}}
+{{#jdk8-no-delegate}}
+    import com.fasterxml.jackson.databind.ObjectMapper;
+{{/jdk8-no-delegate}}
+import io.swagger.annotations.*;
+{{#jdk8-no-delegate}}
+    import org.slf4j.Logger;
+    import org.slf4j.LoggerFactory;
+    import org.springframework.http.HttpStatus;
+{{/jdk8-no-delegate}}
+import org.springframework.http.ResponseEntity;
+{{#useBeanValidation}}
+    import org.springframework.validation.annotation.Validated;
+{{/useBeanValidation}}
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestHeader;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RequestPart;
+import org.springframework.web.multipart.MultipartFile;
+import org.onap.ccsdk.apps.services.RestException;
+
+{{#jdk8-no-delegate}}
+    import javax.servlet.http.HttpServletRequest;
+{{/jdk8-no-delegate}}
+{{#useBeanValidation}}
+    import javax.validation.Valid;
+    import javax.validation.constraints.*;
+{{/useBeanValidation}}
+{{#jdk8-no-delegate}}
+    import java.io.IOException;
+{{/jdk8-no-delegate}}
+import java.util.List;
+{{#jdk8-no-delegate}}
+    import java.util.Optional;
+{{/jdk8-no-delegate}}
+{{^jdk8-no-delegate}}
+    {{#useOptional}}
+        import java.util.Optional;
+    {{/useOptional}}
+{{/jdk8-no-delegate}}
+{{#async}}
+    import java.util.concurrent.{{^jdk8}}Callable{{/jdk8}}{{#jdk8}}CompletableFuture{{/jdk8}};
+{{/async}}
+{{>generatedAnnotation}}
+@Api(value = "{{{baseName}}}", description = "the {{{baseName}}} API")
+{{#operations}}
+    public interface {{classname}} {
+    {{#jdk8}}
+
+        {{^isDelegate}}
+            Logger log = LoggerFactory.getLogger({{classname}}.class);
+
+            default Optional<ObjectMapper> getObjectMapper() {
+                return Optional.empty();
+                }
+
+                default Optional<HttpServletRequest> getRequest() {
+                return Optional.empty();
+                }
+
+                default Optional<String> getAcceptHeader() {
+                return getRequest().map(r -> r.getHeader("Accept"));
+                }
+        {{/isDelegate}}
+        {{#isDelegate}}
+            {{classname}}Delegate getDelegate();
+        {{/isDelegate}}
+    {{/jdk8}}
+    {{#operation}}
+
+            @ApiOperation(value = "{{{summary}}}", nickname = "{{{operationId}}}", notes = "{{{notes}}}"{{#returnBaseType}}, response = {{{returnBaseType}}}.class{{/returnBaseType}}{{#returnContainer}}, responseContainer = "{{{returnContainer}}}"{{/returnContainer}}{{#hasAuthMethods}}, authorizations = {
+        {{#authMethods}}@Authorization(value = "{{name}}"{{#isOAuth}}, scopes = {
+        {{#scopes}}@AuthorizationScope(scope = "{{scope}}", description = "{{description}}"){{#hasMore}},
+        {{/hasMore}}{{/scopes}}
+            }{{/isOAuth}}){{#hasMore}},
+        {{/hasMore}}{{/authMethods}}
+            }{{/hasAuthMethods}}, tags={ {{#vendorExtensions.x-tags}}"{{tag}}",{{/vendorExtensions.x-tags}} })
+            @ApiResponses(value = { {{#responses}}
+                @ApiResponse(code = {{{code}}}, message = "{{{message}}}"{{#baseType}}, response = {{{baseType}}}.class{{/baseType}}{{#containerType}}, responseContainer = "{{{containerType}}}"{{/containerType}}){{#hasMore}},{{/hasMore}}{{/responses}} })
+        {{#implicitHeaders}}
+                @ApiImplicitParams({
+            {{#headerParams}}
+                {{>implicitHeader}}
+            {{/headerParams}}
+                })
+        {{/implicitHeaders}}
+            @RequestMapping(value = "{{{path}}}",{{#singleContentTypes}}
+                produces = "{{{vendorExtensions.x-accepts}}}",
+                consumes = "{{{vendorExtensions.x-contentType}}}",{{/singleContentTypes}}{{^singleContentTypes}}{{#hasProduces}}
+                produces = { {{#produces}}"{{{mediaType}}}"{{#hasMore}}, {{/hasMore}}{{/produces}} }, {{/hasProduces}}{{#hasConsumes}}
+                consumes = { {{#consumes}}"{{{mediaType}}}"{{#hasMore}}, {{/hasMore}}{{/consumes}} },{{/hasConsumes}}{{/singleContentTypes}}
+            method = RequestMethod.{{httpMethod}})
+        {{#jdk8}}default {{/jdk8}}{{#responseWrapper}}{{.}}<{{/responseWrapper}}ResponseEntity<{{>returnTypes}}>{{#responseWrapper}}>{{/responseWrapper}} {{#delegate-method}}_{{/delegate-method}}{{operationId}}({{#allParams}}{{>queryParams}}{{>pathParams}}{{>headerParams}}{{>bodyParams}}{{>formParams}}{{#hasMore}},{{/hasMore}}{{/allParams}}){{^jdk8}};{{/jdk8}}{{#jdk8}} throws RestException {
+        {{#delegate-method}}
+                return {{operationId}}({{#allParams}}{{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}});
+                }
+
+                // Override this method
+                default {{#responseWrapper}}{{.}}<{{/responseWrapper}}ResponseEntity<{{>returnTypes}}>{{#responseWrapper}}>{{/responseWrapper}} {{operationId}}({{#allParams}}{{^isFile}}{{{dataType}}}{{/isFile}}{{#isFile}}MultipartFile{{/isFile}} {{paramName}}{{#hasMore}},{{/hasMore}}{{/allParams}}) throws RestException {
+        {{/delegate-method}}
+        {{^isDelegate}}
+                if(getObjectMapper().isPresent() && getAcceptHeader().isPresent()) {
+            {{#examples}}
+                    if (getAcceptHeader().get().contains("{{{contentType}}}")) {
+                    try {
+                    return {{#async}}CompletableFuture.completedFuture({{/async}}new ResponseEntity<>(getObjectMapper().get().readValue("{{#lambdaRemoveLineBreak}}{{#lambdaEscapeDoubleQuote}}{{{example}}}{{/lambdaEscapeDoubleQuote}}{{/lambdaRemoveLineBreak}}", {{>exampleReturnTypes}}.class), HttpStatus.NOT_IMPLEMENTED){{#async}}){{/async}};
+                    } catch (IOException e) {
+                    log.error("Couldn't serialize response for content type {{{contentType}}}", e);
+                    return {{#async}}CompletableFuture.completedFuture({{/async}}new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR){{#async}}){{/async}};
+                    }
+                    }
+            {{/examples}}
+                } else {
+                log.warn("ObjectMapper or HttpServletRequest not configured in default {{classname}} interface so no example is generated");
+                }
+                return {{#async}}CompletableFuture.completedFuture({{/async}}new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED){{#async}}){{/async}};
+        {{/isDelegate}}
+        {{#isDelegate}}
+                return getDelegate().{{operationId}}({{#allParams}}{{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}});
+        {{/isDelegate}}
+            }{{/jdk8}}
+
+    {{/operation}}
+        }
+{{/operations}}
\ No newline at end of file
diff --git a/ms/sanity-test/sanity-test-app/src/main/yaml/sanitytest-api.yaml b/ms/sanity-test/sanity-test-app/src/main/yaml/sanitytest-api.yaml
new file mode 100644 (file)
index 0000000..f08d195
--- /dev/null
@@ -0,0 +1,107 @@
+---
+swagger: "2.0"
+info:
+  description: "Defines API interface for SDNC sanity tests. "
+  version: "2108.0.1"
+  title: "SANITYTEST-API"
+consumes:
+- "application/json"
+- "application/xml"
+produces:
+- "application/json"
+- "application/xml"
+paths:
+  /operations/SANITYTEST-API:service-configuration-operation/:
+    post:
+      tags:
+      - "SANITYTEST-API"
+      parameters:
+      - in: "body"
+        name: "sanitytest.api.Input.body-param"
+        required: false
+        schema:
+          properties:
+            input:
+              $ref: "#/definitions/sanitytest.api.serviceconfigurationoperation.Input"
+      responses:
+        400:
+          description: "Internal error"
+        200:
+          description: "Correct response"
+          schema:
+            $ref: "#/definitions/sanitytest.api.ServiceConfigurationOperation"
+        201:
+          description: "No response"
+definitions:
+  sanitytest.api.TestNameEnumeration:
+    type: "string"
+    enum:
+      - "EIPAMAdaptor"
+      - "AAI"
+      - "POLICY"
+  sanitytest.api.ResultEnumeration:
+    type: "string"
+    enum:
+      - "Success"
+      - "Failure"
+  sanitytest.api.serviceconfigurationoperation.Input:
+    type: "object"
+    properties:
+      request-information:
+        $ref: "#/definitions/sanitytest.api.RequestInformation"
+  sanitytest.api.RequestInformation:
+    type: "object"
+    properties:
+      test-list:
+        type: "array"
+        items:
+          $ref: "#/definitions/sanitytest.api.TestListItem"
+  sanitytest.api.TestListItem:
+    type: "object"
+    properties:
+      test-number:
+        type: "integer"
+        format: "int16"
+      test-name:
+        $ref: "#/definitions/sanitytest.api.TestNameEnumeration"
+      test-data:
+        type: "array"
+        items:
+          $ref: "#/definitions/sanitytest.api.TestDataItem"
+  sanitytest.api.TestDataItem:
+    type: "object"
+    properties:
+      data-name:
+        type: "string"
+      data-value:
+        type: "string"
+  sanitytest.api.ServiceConfigurationOperation:
+    type: "object"
+    properties:
+      output:
+        $ref: "#/definitions/sanitytest.api.ResponseFields"
+  sanitytest.api.ResponseFields:
+    type: "object"
+    properties:
+      response-information: 
+        type: "array"
+        items:
+          $ref: "#/definitions/sanitytest.api.ResponseField"
+  sanitytest.api.ResponseField:
+    type: "object"
+    properties:
+      response-test-number:
+        type: "integer"
+        format: "int16"
+      response-test-name:
+        $ref: "#/definitions/sanitytest.api.TestNameEnumeration"
+      start-time:
+        type: "string"
+      end-time:
+        type: "string"
+      elapsed-time:
+        type: "string"
+      result:
+        $ref: "#/definitions/sanitytest.api.ResultEnumeration"
+      error-message:
+        type: "string"
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 7a72e11..2192fec 100644 (file)
--- a/pom.xml
+++ b/pom.xml
     <description>POM to be used for apps in SDNC project</description>
     <url>http://wiki.onap.org</url>
 
+    <properties>
+        <aaf.cadi.version>2.1.21</aaf.cadi.version>
+        <ccsdk.apps.version>1.3.0-SNAPSHOT</ccsdk.apps.version>
+        <ccsdk.docker.version>1.3-STAGING-latest</ccsdk.docker.version>
+        <ccsdk.distribution.version>1.3.0-SNAPSHOT</ccsdk.distribution.version>
+        <sdnc.northbound.version>2.3.0-SNAPSHOT</sdnc.northbound.version>
+        <sdnc.oam.version>2.3.0-SNAPSHOT</sdnc.oam.version>
+    </properties>
+
     <modules>
         <module>ms</module>
     </modules>
index 002daf4..176e71a 100644 (file)
@@ -16,6 +16,7 @@ See the License for the specific language governing permissions and
 limitations under the License.
 ============LICENSE_END=====================================================
 -->
+
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
 
index f7c8333..8805c5e 100644 (file)
@@ -16,6 +16,7 @@ See the License for the specific language governing permissions and
 limitations under the License.
 ============LICENSE_END=====================================================
 -->
+
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
 
index 0753544..dcf7643 100644 (file)
@@ -16,6 +16,7 @@ See the License for the specific language governing permissions and
 limitations under the License.
 ============LICENSE_END=====================================================
 -->
+
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
 
index 8b871fb..d480119 100644 (file)
@@ -16,6 +16,7 @@ See the License for the specific language governing permissions and
 limitations under the License.
 ============LICENSE_END=====================================================
 -->
+
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>