Merge "Fix security hotspots n Regex"
authorBruno Sakoto <bruno.sakoto@bell.ca>
Wed, 7 Apr 2021 12:55:41 +0000 (12:55 +0000)
committerGerrit Code Review <gerrit@onap.org>
Wed, 7 Apr 2021 12:55:41 +0000 (12:55 +0000)
45 files changed:
cps-application/pom.xml
cps-application/src/main/resources/application.yml [moved from docker-compose/application.yml with 59% similarity]
cps-bom/pom.xml
cps-ncmp-rest/docs/openapi/components.yaml [moved from cps-nf-proxy-rest/docs/openapi/components.yaml with 71% similarity]
cps-ncmp-rest/docs/openapi/ncmproxy.yml [moved from cps-nf-proxy-rest/docs/openapi/xnfProxy.yml with 76% similarity]
cps-ncmp-rest/docs/openapi/openapi.yml [new file with mode: 0755]
cps-ncmp-rest/pom.xml [new file with mode: 0644]
cps-ncmp-rest/src/main/java/org/onap/cps/ncmp/config/NetworkCmProxyConfig.java [moved from cps-nf-proxy-rest/src/main/java/org/onap/cps/nfproxy/config/NfProxyConfig.java with 89% similarity]
cps-ncmp-rest/src/main/java/org/onap/cps/ncmp/rest/controller/NetworkCmProxyController.java [moved from cps-nf-proxy-rest/src/main/java/org/onap/cps/nfproxy/rest/controller/NfProxyController.java with 81% similarity]
cps-ncmp-rest/src/main/java/org/onap/cps/ncmp/rest/exceptions/NetworkCmProxyRestExceptionHandler.java [moved from cps-nf-proxy-rest/src/main/java/org/onap/cps/nfproxy/rest/exceptions/NfProxyRestExceptionHandler.java with 90% similarity]
cps-ncmp-rest/src/main/resources/openapi-configuration.json [moved from cps-nf-proxy-rest/src/main/resources/openapi-configuration.json with 87% similarity]
cps-ncmp-rest/src/test/groovy/org/onap/cps/ncmp/config/NetworkCmProxyConfigSpec.groovy [moved from cps-nf-proxy-rest/src/test/groovy/org/onap/cps/nfproxy/config/NfProxyConfigSpec.groovy with 76% similarity]
cps-ncmp-rest/src/test/groovy/org/onap/cps/ncmp/rest/controller/NetworkCmProxyControllerSpec.groovy [moved from cps-nf-proxy-rest/src/test/groovy/org/onap/cps/nfproxy/rest/controller/NfProxyControllerSpec.groovy with 89% similarity]
cps-ncmp-rest/src/test/groovy/org/onap/cps/ncmp/rest/exceptions/NetworkCmProxyRestExceptionHandlerSpec.groovy [moved from cps-nf-proxy-rest/src/test/groovy/org/onap/cps/nfproxy/rest/exceptions/NfProxyRestExceptionHandlerSpec.groovy with 89% similarity]
cps-ncmp-rest/src/test/java/org/onap/cps/TestApplication.java [moved from cps-nf-proxy-rest/src/test/java/org/onap/cps/TestApplication.java with 100% similarity]
cps-ncmp-rest/src/test/resources/application.yml [new file with mode: 0644]
cps-ncmp-service/pom.xml [new file with mode: 0644]
cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/NetworkCmProxyDataService.java [moved from cps-nf-proxy-service/src/main/java/org/onap/cps/nfproxy/api/NfProxyDataService.java with 90% similarity]
cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/NetworkCmProxyDataServiceImpl.java [moved from cps-nf-proxy-service/src/main/java/org/onap/cps/nfproxy/api/impl/NfProxyDataServiceImpl.java with 93% similarity]
cps-ncmp-service/src/test/groovy/org/onap/cps/api/impl/NetworkCmProxyDataServiceImplSpec.groovy [moved from cps-nf-proxy-service/src/test/groovy/org/onap/cps/api/impl/NfProxyDataServiceImplSpec.groovy with 94% similarity]
cps-nf-proxy-rest/docs/openapi/openapi.yml [deleted file]
cps-nf-proxy-rest/pom.xml [deleted file]
cps-nf-proxy-rest/src/test/resources/application.yml [deleted file]
cps-nf-proxy-service/pom.xml [deleted file]
cps-parent/pom.xml
cps-ri/src/main/java/org/onap/cps/spi/impl/CpsAdminPersistenceServiceImpl.java
cps-ri/src/test/groovy/org/onap/cps/spi/impl/CpsAdminPersistenceServiceSpec.groovy
cps-ri/src/test/resources/data/anchor.sql
cps-service/src/main/java/org/onap/cps/api/CpsAdminService.java
cps-service/src/main/java/org/onap/cps/api/impl/CpsAdminServiceImpl.java
cps-service/src/main/java/org/onap/cps/spi/CpsAdminPersistenceService.java
cps-service/src/main/java/org/onap/cps/spi/model/DataNodeBuilder.java
cps-service/src/test/groovy/org/onap/cps/api/impl/CpsAdminServiceImplSpec.groovy
cps-service/src/test/groovy/org/onap/cps/api/impl/E2ENetworkSliceSpec.groovy
cps-service/src/test/groovy/org/onap/cps/model/DataNodeBuilderSpec.groovy
cps-service/src/test/resources/ietf/data/ietf-network-topology-sample-rfc8345.json [new file with mode: 0644]
cps-service/src/test/resources/ietf/ietf-inet-types@2013-07-15.yang [moved from cps-service/src/test/resources/e2e/basic/ietf-inet-types.yang with 99% similarity, mode: 0644]
cps-service/src/test/resources/ietf/ietf-network-state@2018-02-26.yang [new file with mode: 0644]
cps-service/src/test/resources/ietf/ietf-network-topology-state@2018-02-26.yang [new file with mode: 0644]
cps-service/src/test/resources/ietf/ietf-network-topology@2018-02-26.yang [new file with mode: 0644]
cps-service/src/test/resources/ietf/ietf-network@2018-02-26.yang [new file with mode: 0644]
cps-service/src/test/resources/ietf/ietf-yang-types@2013-07-15.yang [moved from cps-service/src/test/resources/e2e/basic/ietf-yang-types.yang with 99% similarity, mode: 0644]
docker-compose/README.md
docker-compose/docker-compose.yml
pom.xml

index fa4b5ef..64921f6 100755 (executable)
@@ -3,6 +3,7 @@
   ============LICENSE_START=======================================================
   Copyright (c) 2021 Pantheon.tech.
   Modifications Copyright (C) 2021 Bell Canada.
+  Modification Copyright (C) 2021 Nordix Foundation
   ================================================================================
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
             </build>
         </profile>
         <profile>
-            <id>xnf-docker</id>
+            <id>ncmp-docker</id>
             <activation>
                 <activeByDefault>false</activeByDefault>
             </activation>
 
             <properties>
-                <image.name>cps-nf-proxy</image.name>
+                <image.name>cps-ncmp</image.name>
             </properties>
 
             <dependencies>
                 <dependency>
                     <groupId>${project.groupId}</groupId>
-                    <artifactId>cps-nf-proxy-rest</artifactId>
+                    <artifactId>cps-ncmp-rest</artifactId>
+                    <version>${project.version}</version>
                 </dependency>
                 <dependency>
                     <groupId>${project.groupId}</groupId>
             </build>
         </profile>
         <profile>
-            <id>cps-xnf-docker</id>
+            <id>cps-ncmp-docker</id>
             <activation>
                 <activeByDefault>true</activeByDefault>
             </activation>
 
             <properties>
-                <image.name>cps-and-nf-proxy</image.name>
+                <image.name>cps-and-ncmp</image.name>
             </properties>
 
             <dependencies>
                 </dependency>
                 <dependency>
                     <groupId>${project.groupId}</groupId>
-                    <artifactId>cps-nf-proxy-rest</artifactId>
+                    <artifactId>cps-ncmp-rest</artifactId>
+                    <version>${project.version}</version>
                 </dependency>
                 <dependency>
                     <groupId>${project.groupId}</groupId>
similarity index 59%
rename from docker-compose/application.yml
rename to cps-application/src/main/resources/application.yml
index be4b688..d9b9e7c 100644 (file)
@@ -1,10 +1,27 @@
+#  ============LICENSE_START=======================================================\r
+#  Modification (C) 2021 Nordix Foundation\r
+#  ================================================================================\r
+#  Licensed under the Apache License, Version 2.0 (the "License");\r
+#  you may not use this file except in compliance with the License.\r
+#  You may obtain a copy of the License at\r
+#\r
+#        http://www.apache.org/licenses/LICENSE-2.0\r
+#  Unless required by applicable law or agreed to in writing, software\r
+#  distributed under the License is distributed on an "AS IS" BASIS,\r
+#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+#  See the License for the specific language governing permissions and\r
+#  limitations under the License.\r
+#\r
+#  SPDX-License-Identifier: Apache-2.0\r
+#  ============LICENSE_END=========================================================\r
+\r
 server:\r
     port: 8080\r
 \r
 rest:\r
     api:\r
         cps-base-path: /cps/api\r
-        xnf-base-path: /cps-nf-proxy/api\r
+        ncmp-base-path: /cps-ncmp/api\r
 \r
 spring:\r
     main:\r
index ebd18d9..12961b8 100644 (file)
@@ -1,4 +1,22 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ============LICENSE_START=======================================================
+  Modification Copyright (C) 2021 Nordix Foundation
+  ================================================================================
+  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">
             </dependency>
             <dependency>
                 <groupId>${project.groupId}</groupId>
-                <artifactId>cps-nf-proxy-service</artifactId>
+                <artifactId>cps-ncmp-service</artifactId>
                 <version>${project.version}</version>
             </dependency>
             <dependency>
                 <groupId>${project.groupId}</groupId>
-                <artifactId>cps-nf-proxy-rest</artifactId>
+                <artifactId>cps-ncmp-rest</artifactId>
                 <version>${project.version}</version>
             </dependency>
             <dependency>
similarity index 71%
rename from cps-nf-proxy-rest/docs/openapi/components.yaml
rename to cps-ncmp-rest/docs/openapi/components.yaml
index af95723..69c37ad 100644 (file)
@@ -1,3 +1,20 @@
+#  ============LICENSE_START=======================================================
+#  Modification (C) 2021 Nordix Foundation
+#  ================================================================================
+#  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.
+#
+#  SPDX-License-Identifier: Apache-2.0
+#  ============LICENSE_END=========================================================
+
 components:
   schemas:
     ErrorMessage:
@@ -23,7 +40,7 @@ components:
     cmHandleInPath:
       name: cm-handle
       in: path
-      description: The identifier for a network function, network element, subnetwork or any other cm object by managed NF-Proxy
+      description: The identifier for a network function, network element, subnetwork or any other cm object by managed Network CM Proxy
       required: true
       schema:
         type: string
similarity index 76%
rename from cps-nf-proxy-rest/docs/openapi/xnfProxy.yml
rename to cps-ncmp-rest/docs/openapi/ncmproxy.yml
index 141e472..2a70d70 100644 (file)
@@ -1,8 +1,25 @@
+#  ============LICENSE_START=======================================================
+#  Modification (C) 2021 Nordix Foundation
+#  ================================================================================
+#  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.
+#
+#  SPDX-License-Identifier: Apache-2.0
+#  ============LICENSE_END=========================================================
+
 nodeByCmHandleAndXpath:
   get:
     description: Get a node with an option to retrieve all the children for a given cm Handle
     tags:
-      - nf-proxy
+      - network-cm-proxy
     summary: Get a node given a cm Handle and xpath
     operationId: getNodeByCmHandleAndXpath
     parameters:
@@ -27,7 +44,7 @@ nodesByCmHandleAndCpsPath:
   get:
     description: Query nodes for the given cps path and cm Handle
     tags:
-      - nf-proxy
+      - network-cm-proxy
     summary: Query data nodes
     operationId: queryNodesByCmHandleAndCpsPath
     parameters:
@@ -50,7 +67,7 @@ nodesByCmHandleAndXpath:
   patch:
     description: Update node leaves for the given cps path and cm Handle
     tags:
-      - nf-proxy
+      - network-cm-proxy
     summary: Update node leaves
     operationId: updateNodeLeaves
     parameters:
@@ -77,7 +94,7 @@ nodesByCmHandleAndXpath:
   put:
     description: Replace a node with descendants for the given cps path and cm Handle
     tags:
-      - nf-proxy
+      - network-cm-proxy
     summary: Replace a node with descendants
     operationId: replaceNode
     parameters:
diff --git a/cps-ncmp-rest/docs/openapi/openapi.yml b/cps-ncmp-rest/docs/openapi/openapi.yml
new file mode 100755 (executable)
index 0000000..7575022
--- /dev/null
@@ -0,0 +1,33 @@
+#  ============LICENSE_START=======================================================
+#  Modification (C) 2021 Nordix Foundation
+#  ================================================================================
+#  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.
+#
+#  SPDX-License-Identifier: Apache-2.0
+#  ============LICENSE_END=========================================================
+
+openapi: 3.0.1
+info:
+  title: NCMP to CPS Proxy API
+  description: NCMP to CPS Proxy API
+  version: "1.0"
+servers:
+  - url: //localhost:8088/
+paths:
+  /v1/cm-handles/{cm-handle}/node:
+    $ref: 'ncmproxy.yml#/nodeByCmHandleAndXpath'
+
+  /v1/cm-handles/{cm-handle}/nodes/query:
+    $ref: 'ncmproxy.yml#/nodesByCmHandleAndCpsPath'
+
+  /v1/cm-handles/{cm-handle}/nodes:
+    $ref: 'ncmproxy.yml#/nodesByCmHandleAndXpath'
\ No newline at end of file
diff --git a/cps-ncmp-rest/pom.xml b/cps-ncmp-rest/pom.xml
new file mode 100644 (file)
index 0000000..3abeb7d
--- /dev/null
@@ -0,0 +1,136 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ============LICENSE_START=======================================================
+  Modification Copyright (C) 2021 Nordix Foundation
+  ================================================================================
+  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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+<modelVersion>4.0.0</modelVersion>
+<parent>
+    <groupId>org.onap.cps</groupId>
+    <artifactId>cps-parent</artifactId>
+    <version>1.1.0-SNAPSHOT</version>
+    <relativePath>../cps-parent/pom.xml</relativePath>
+</parent>
+
+<artifactId>cps-ncmp-rest</artifactId>
+
+<properties>
+    <minimum-coverage>0.0</minimum-coverage>
+</properties>
+
+<dependencies>
+    <dependency>
+        <groupId>${project.groupId}</groupId>
+        <artifactId>cps-ncmp-service</artifactId>
+        <version>${project.version}</version>
+    </dependency>
+    <dependency>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-starter-web</artifactId>
+        <exclusions>
+            <exclusion>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-starter-tomcat</artifactId>
+            </exclusion>
+        </exclusions>
+    </dependency>
+    <dependency>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-starter-jetty</artifactId>
+    </dependency>
+    <dependency>
+        <groupId>io.swagger.core.v3</groupId>
+        <artifactId>swagger-annotations</artifactId>
+    </dependency>
+    <dependency>
+        <groupId>io.springfox</groupId>
+        <artifactId>springfox-boot-starter</artifactId>
+    </dependency>
+    <dependency>
+        <groupId>io.swagger</groupId>
+        <artifactId>swagger-annotations</artifactId>
+    </dependency>
+    <!-- T E S T   D E P E N D E N C I E S -->
+    <dependency>
+        <groupId>org.codehaus.groovy</groupId>
+        <artifactId>groovy</artifactId>
+        <scope>test</scope>
+    </dependency>
+    <dependency>
+        <groupId>org.spockframework</groupId>
+        <artifactId>spock-core</artifactId>
+        <scope>test</scope>
+    </dependency>
+    <dependency>
+        <groupId>org.spockframework</groupId>
+        <artifactId>spock-spring</artifactId>
+        <scope>test</scope>
+    </dependency>
+    <dependency>
+        <groupId>cglib</groupId>
+        <artifactId>cglib-nodep</artifactId>
+        <scope>test</scope>
+    </dependency>
+    <dependency>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-starter-test</artifactId>
+        <scope>test</scope>
+        <exclusions>
+            <exclusion>
+                <groupId>org.junit.vintage</groupId>
+                <artifactId>junit-vintage-engine</artifactId>
+            </exclusion>
+        </exclusions>
+    </dependency>
+    <dependency>
+        <groupId>com.google.code.gson</groupId>
+        <artifactId>gson</artifactId>
+    </dependency>
+</dependencies>
+
+<build>
+    <plugins>
+        <!-- Swagger code generation. -->
+        <plugin>
+            <groupId>io.swagger.codegen.v3</groupId>
+            <artifactId>swagger-codegen-maven-plugin</artifactId>
+            <executions>
+                <execution>
+                    <goals>
+                        <goal>generate</goal>
+                    </goals>
+                    <configuration>
+                        <inputSpec>${project.basedir}/docs/openapi/openapi.yml</inputSpec>
+                        <invokerPackage>org.onap.cps.ncmp.rest.controller</invokerPackage>
+                        <modelPackage>org.onap.cps.ncmp.rest.model</modelPackage>
+                        <apiPackage>org.onap.cps.ncmp.rest.api</apiPackage>
+                        <language>spring</language>
+                        <generateSupportingFiles>false</generateSupportingFiles>
+                        <configOptions>
+                            <sourceFolder>src/gen/java</sourceFolder>
+                            <dateLibrary>java11</dateLibrary>
+                            <interfaceOnly>true</interfaceOnly>
+                            <useTags>true</useTags>
+                        </configOptions>
+                    </configuration>
+                </execution>
+            </executions>
+        </plugin>
+    </plugins>
+</build>
+</project>
@@ -1,6 +1,7 @@
 /*-
  * ============LICENSE_START=======================================================
  *  Copyright (C) 2021 Pantheon.tech
+ *  Modifications (C) 2021 Nordix Foundation
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -18,7 +19,7 @@
  * ============LICENSE_END=========================================================
  */
 
-package org.onap.cps.nfproxy.config;
+package org.onap.cps.ncmp.config;
 
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
@@ -28,15 +29,15 @@ import springfox.documentation.spi.DocumentationType;
 import springfox.documentation.spring.web.plugins.Docket;
 
 @Configuration
-public class NfProxyConfig {
+public class NetworkCmProxyConfig {
 
     /**
      * Swagger-ui configuration.
      */
-    @Bean("nf-proxy-docket")
+    @Bean("ncmp-docket")
     public Docket api() {
         return new Docket(DocumentationType.OAS_30)
-            .groupName("nf-proxy-docket")
+            .groupName("ncmp-docket")
             .select()
             .apis(RequestHandlerSelectors.any())
             .paths(PathSelectors.any())
  *  ============LICENSE_END=========================================================
  */
 
-package org.onap.cps.nfproxy.rest.controller;
+package org.onap.cps.ncmp.rest.controller;
 
 import com.google.gson.Gson;
 import com.google.gson.GsonBuilder;
 import java.util.Collection;
 import javax.validation.Valid;
-import org.onap.cps.nfproxy.api.NfProxyDataService;
-import org.onap.cps.nfproxy.rest.api.NfProxyApi;
+import org.onap.cps.ncmp.api.NetworkCmProxyDataService;
+import org.onap.cps.ncmp.rest.api.NetworkCmProxyApi;
 import org.onap.cps.spi.FetchDescendantsOption;
 import org.onap.cps.spi.model.DataNode;
 import org.onap.cps.utils.DataMapUtils;
@@ -38,14 +38,14 @@ import org.springframework.web.bind.annotation.RestController;
 
 
 @RestController
-@RequestMapping("${rest.api.xnf-base-path}")
-public class NfProxyController implements NfProxyApi {
+@RequestMapping("${rest.api.ncmp-base-path}")
+public class NetworkCmProxyController implements NetworkCmProxyApi {
 
     private static final Gson GSON = new GsonBuilder().create();
     private static final String XPATH_ROOT = "/";
 
     @Autowired
-    private NfProxyDataService nfProxyDataService;
+    private NetworkCmProxyDataService networkCmProxyDataService;
 
     @Override
     public ResponseEntity<Object> getNodeByCmHandleAndXpath(final String cmHandle, @Valid final String xpath,
@@ -55,7 +55,7 @@ public class NfProxyController implements NfProxyApi {
         }
         final FetchDescendantsOption fetchDescendantsOption = Boolean.TRUE.equals(includeDescendants)
             ? FetchDescendantsOption.INCLUDE_ALL_DESCENDANTS : FetchDescendantsOption.OMIT_DESCENDANTS;
-        final DataNode dataNode = nfProxyDataService.getDataNode(cmHandle, xpath, fetchDescendantsOption);
+        final DataNode dataNode = networkCmProxyDataService.getDataNode(cmHandle, xpath, fetchDescendantsOption);
         return new ResponseEntity<>(DataMapUtils.toDataMap(dataNode), HttpStatus.OK);
     }
 
@@ -65,21 +65,21 @@ public class NfProxyController implements NfProxyApi {
         final FetchDescendantsOption fetchDescendantsOption = Boolean.TRUE.equals(includeDescendants)
             ? FetchDescendantsOption.INCLUDE_ALL_DESCENDANTS : FetchDescendantsOption.OMIT_DESCENDANTS;
         final Collection<DataNode> dataNodes =
-            nfProxyDataService.queryDataNodes(cmHandle, cpsPath, fetchDescendantsOption);
+            networkCmProxyDataService.queryDataNodes(cmHandle, cpsPath, fetchDescendantsOption);
         return new ResponseEntity<>(GSON.toJson(dataNodes), HttpStatus.OK);
     }
 
     @Override
     public ResponseEntity<Object> replaceNode(@Valid final String jsonData, final String cmHandle,
         @Valid final String parentNodeXpath) {
-        nfProxyDataService.replaceNodeTree(cmHandle, parentNodeXpath, jsonData);
+        networkCmProxyDataService.replaceNodeTree(cmHandle, parentNodeXpath, jsonData);
         return new ResponseEntity<>(HttpStatus.OK);
     }
 
     @Override
     public ResponseEntity<Object> updateNodeLeaves(@Valid final String jsonData, final String cmHandle,
         @Valid final String parentNodeXpath) {
-        nfProxyDataService.updateNodeLeaves(cmHandle, parentNodeXpath, jsonData);
+        networkCmProxyDataService.updateNodeLeaves(cmHandle, parentNodeXpath, jsonData);
         return new ResponseEntity<>(HttpStatus.OK);
     }
 }
  *  ============LICENSE_END=========================================================
  */
 
-package org.onap.cps.nfproxy.rest.exceptions;
+package org.onap.cps.ncmp.rest.exceptions;
 
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
-import org.onap.cps.nfproxy.rest.controller.NfProxyController;
-import org.onap.cps.nfproxy.rest.model.ErrorMessage;
+import org.onap.cps.ncmp.rest.controller.NetworkCmProxyController;
+import org.onap.cps.ncmp.rest.model.ErrorMessage;
 import org.onap.cps.spi.exceptions.CpsException;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
@@ -35,8 +35,8 @@ import org.springframework.web.bind.annotation.RestControllerAdvice;
  */
 @Slf4j
 @NoArgsConstructor(access = AccessLevel.PRIVATE)
-@RestControllerAdvice(assignableTypes = {NfProxyController.class})
-public class NfProxyRestExceptionHandler {
+@RestControllerAdvice(assignableTypes = {NetworkCmProxyController.class})
+public class NetworkCmProxyRestExceptionHandler {
 
     private static final String CHECK_LOGS_FOR_DETAILS = "Check logs for details.";
 
@@ -1,12 +1,12 @@
 {
     "resourcePackages": [
-        "org.onap.cps.nfproxy.rest.controller"
+        "org.onap.cps.ncmp.rest.controller"
     ],
     "prettyPrint": true,
     "cacheTTL": 0,
     "openAPI": {
         "info": {
-            "title": "ONAP Open API v3 CPS xNF Proxy Spec",
+            "title": "ONAP Open API v3 CPS Network CM Proxy Spec",
             "description": "The API Description may be multiline, and GitHub Flavored Markdown, GFM syntax, can be used for rich text representation.",
             "x-logo": {
                 "url": "logo.png"
@@ -1,6 +1,7 @@
 /*
  * ============LICENSE_START=======================================================
  *  Copyright (C) 2021 highstreet technologies GmbH
+ *  Modification Copyright (C) 2021 Nordix Foundation
  *  ================================================================================
  *  Licensed under the Apache License, Version 2.0 (the "License");
  *  you may not use this file except in compliance with the License.
  *  ============LICENSE_END=========================================================
  */
 
-package org.onap.cps.nfproxy.config
+package org.onap.cps.ncmp.config
 
 import spock.lang.Specification
 import springfox.documentation.spring.web.plugins.Docket
 
-class NfProxyConfigSpec extends Specification {
-    def objectUnderTest = new NfProxyConfig()
+class NetworkCmProxyConfigSpec extends Specification {
+    def objectUnderTest = new NetworkCmProxyConfig()
 
-    def 'NfProxy configuration has a Docket API.'() {
-        expect: 'the NfProxy configuration has a Docket API'
+    def 'NetworkCmProxy configuration has a Docket API.'() {
+        expect: 'the NetworkCmProxy configuration has a Docket API'
             objectUnderTest.api() instanceof Docket
     }
 }
  *  ============LICENSE_END=========================================================
  */
 
-package org.onap.cps.nfproxy.rest.controller
+package org.onap.cps.ncmp.rest.controller
 
 
 import com.google.gson.Gson
-import org.onap.cps.nfproxy.api.NfProxyDataService
+import org.onap.cps.ncmp.api.NetworkCmProxyDataService
 import org.onap.cps.spi.model.DataNodeBuilder
 import org.spockframework.spring.SpringBean
 import org.springframework.beans.factory.annotation.Autowired
@@ -40,15 +40,15 @@ import static org.onap.cps.spi.FetchDescendantsOption.OMIT_DESCENDANTS
 import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*
 
 @WebMvcTest
-class NfProxyControllerSpec extends Specification {
+class NetworkCmProxyControllerSpec extends Specification {
 
     @Autowired
     MockMvc mvc
 
     @SpringBean
-    NfProxyDataService mockNfProxyDataService = Mock()
+    NetworkCmProxyDataService mockNetworkCmProxyDataService = Mock()
 
-    @Value('${rest.api.xnf-base-path}')
+    @Value('${rest.api.ncmp-base-path}')
     def basePath
 
     def dataNodeBaseEndpoint
@@ -65,7 +65,7 @@ class NfProxyControllerSpec extends Specification {
         given: 'service method returns a list containing a data node'
             def dataNode = new DataNodeBuilder().withXpath('/xpath').build()
             def cpsPath = 'some cps-path'
-            mockNfProxyDataService.queryDataNodes(cmHandle, cpsPath, expectedCpsDataServiceOption) >> [dataNode]
+            mockNetworkCmProxyDataService.queryDataNodes(cmHandle, cpsPath, expectedCpsDataServiceOption) >> [dataNode]
         and: 'the query endpoint'
             def dataNodeEndpoint = "$dataNodeBaseEndpoint/cm-handles/$cmHandle/nodes/query"
         when: 'query data nodes API is invoked'
@@ -97,7 +97,7 @@ class NfProxyControllerSpec extends Specification {
                             .param('xpath', xpath)
             ).andReturn().response
         then: 'the service method is invoked once with expected parameters'
-            1 * mockNfProxyDataService.updateNodeLeaves(cmHandle, xpath, jsonData)
+            1 * mockNetworkCmProxyDataService.updateNodeLeaves(cmHandle, xpath, jsonData)
         and: 'response status indicates success'
             response.status == HttpStatus.OK.value()
     }
@@ -115,7 +115,7 @@ class NfProxyControllerSpec extends Specification {
                             .param('xpath', xpath)
             ).andReturn().response
         then: 'the service method is invoked once with expected parameters'
-            1 * mockNfProxyDataService.replaceNodeTree(cmHandle, xpath, jsonData)
+            1 * mockNetworkCmProxyDataService.replaceNodeTree(cmHandle, xpath, jsonData)
         and: 'response status indicates success'
             response.status == HttpStatus.OK.value()
     }
@@ -124,7 +124,7 @@ class NfProxyControllerSpec extends Specification {
         given: 'the service returns a data node'
             def xpath = 'some xpath'
             def dataNode = new DataNodeBuilder().withXpath(xpath).withLeaves(["leaf": "value"]).build()
-            mockNfProxyDataService.getDataNode(cmHandle, xpath, OMIT_DESCENDANTS) >> dataNode
+            mockNetworkCmProxyDataService.getDataNode(cmHandle, xpath, OMIT_DESCENDANTS) >> dataNode
         and: 'the query endpoint'
             def endpoint = "$dataNodeBaseEndpoint/cm-handles/$cmHandle/node"
         when: 'get request is performed through REST API'
@@ -1,6 +1,7 @@
 /*
  * ============LICENSE_START=======================================================
  *  Copyright (C) 2021 highstreet technologies GmbH
+ *  Modification Copyright (C) 2021 Nordix Foundation
  *  ================================================================================
  *  Licensed under the Apache License, Version 2.0 (the "License");
  *  you may not use this file except in compliance with the License.
  *  ============LICENSE_END=========================================================
  */
 
-package org.onap.cps.nfproxy.rest.exceptions
+package org.onap.cps.ncmp.rest.exceptions
 
 import groovy.json.JsonSlurper
-import org.onap.cps.nfproxy.api.NfProxyDataService
+import org.onap.cps.ncmp.api.NetworkCmProxyDataService
 import org.onap.cps.spi.FetchDescendantsOption
 import org.onap.cps.spi.exceptions.CpsException
 import org.spockframework.spring.SpringBean
@@ -35,15 +36,15 @@ import static org.springframework.http.HttpStatus.INTERNAL_SERVER_ERROR
 import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get
 
 @WebMvcTest
-class NfProxyRestExceptionHandlerSpec extends Specification {
+class NetworkCmProxyRestExceptionHandlerSpec extends Specification {
 
     @Autowired
     MockMvc mvc
 
     @SpringBean
-    NfProxyDataService mockNfProxyDataService = Mock()
+    NetworkCmProxyDataService mockNetworkCmProxyDataService = Mock()
 
-    @Value('${rest.api.xnf-base-path}')
+    @Value('${rest.api.ncmp-base-path}')
     def basePath
 
     def dataNodeBaseEndpoint
@@ -77,7 +78,7 @@ class NfProxyRestExceptionHandlerSpec extends Specification {
     }
 
     def setupTestException(exception) {
-        mockNfProxyDataService.getDataNode(cmHandle, xpath, FetchDescendantsOption.OMIT_DESCENDANTS) >>
+        mockNetworkCmProxyDataService.getDataNode(cmHandle, xpath, FetchDescendantsOption.OMIT_DESCENDANTS) >>
                 { throw exception}
     }
 
diff --git a/cps-ncmp-rest/src/test/resources/application.yml b/cps-ncmp-rest/src/test/resources/application.yml
new file mode 100644 (file)
index 0000000..14ccf06
--- /dev/null
@@ -0,0 +1,21 @@
+#  ============LICENSE_START=======================================================
+#  Copyright (C) 2021 Nordix Foundation
+#  ================================================================================
+#  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.
+#
+#  SPDX-License-Identifier: Apache-2.0
+#  ============LICENSE_END=========================================================
+
+rest:
+    api:
+        ncmp-base-path: /cps-ncmp/api
+spring:
\ No newline at end of file
diff --git a/cps-ncmp-service/pom.xml b/cps-ncmp-service/pom.xml
new file mode 100644 (file)
index 0000000..ddb78d3
--- /dev/null
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ============LICENSE_START=======================================================
+  Modification Copyright (C) 2021 Nordix Foundation
+  ================================================================================
+  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.cps</groupId>
+    <artifactId>cps-parent</artifactId>
+    <version>1.1.0-SNAPSHOT</version>
+    <relativePath>../cps-parent/pom.xml</relativePath>
+</parent>
+
+<artifactId>cps-ncmp-service</artifactId>
+
+<properties>
+    <minimum-coverage>0.0</minimum-coverage>
+</properties>
+
+<dependencies>
+    <dependency>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-starter-validation</artifactId>
+    </dependency>
+    <dependency>
+        <groupId>${project.groupId}</groupId>
+        <artifactId>cps-service</artifactId>
+    </dependency>
+    <dependency>
+        <groupId>org.spockframework</groupId>
+        <artifactId>spock-core</artifactId>
+        <scope>test</scope>
+    </dependency>
+</dependencies>
+</project>
\ No newline at end of file
@@ -18,7 +18,7 @@
  *  ============LICENSE_END=========================================================
  */
 
-package org.onap.cps.nfproxy.api;
+package org.onap.cps.ncmp.api;
 
 import java.util.Collection;
 import org.checkerframework.checker.nullness.qual.NonNull;
@@ -28,13 +28,13 @@ import org.onap.cps.spi.model.DataNode;
 /*
  * Datastore interface for handling CPS data.
  */
-public interface NfProxyDataService {
+public interface NetworkCmProxyDataService {
 
     /**
      * Retrieves datanode by XPath for a given cm handle.
      *
      * @param cmHandle               The identifier for a network function, network element, subnetwork or any other cm
-     *                               object by managed NF-Proxy
+     *                               object by managed Network CM Proxy
      * @param xpath                  xpath
      * @param fetchDescendantsOption defines the scope of data to fetch: either single node or all the descendant nodes
      *                               (recursively) as well
@@ -47,7 +47,7 @@ public interface NfProxyDataService {
      * Get datanodes for the given cm handle by cps path.
      *
      * @param cmHandle               The identifier for a network function, network element, subnetwork or any other cm
-     *                               object by managed NF-Proxy
+     *                               object by managed Network CM Proxy
      * @param cpsPath                cps path
      * @param fetchDescendantsOption defines whether the descendants of the node(s) found by the query should be
      *                               included in the output
@@ -60,7 +60,7 @@ public interface NfProxyDataService {
      * Updates data node for given cm handle using xpath to parent node.
      *
      * @param cmHandle        The identifier for a network function, network element, subnetwork or any other cm object
-     *                        by managed NF-Proxy
+     *                        by managed Network CM Proxy
      * @param parentNodeXpath xpath to parent node
      * @param jsonData        json data
      */
@@ -70,7 +70,7 @@ public interface NfProxyDataService {
      * Replaces existing data node content including descendants.
      *
      * @param cmHandle        The identifier for a network function, network element, subnetwork or any other cm object
-     *                        by managed NF-Proxy
+     *                        by managed Network CM Proxy
      * @param parentNodeXpath xpath to parent node
      * @param jsonData        json data
      */
  *  ============LICENSE_END=========================================================
  */
 
-package org.onap.cps.nfproxy.api.impl;
+package org.onap.cps.ncmp.api.impl;
 
 import java.util.Collection;
 import org.onap.cps.api.CpsDataService;
 import org.onap.cps.api.CpsQueryService;
-import org.onap.cps.nfproxy.api.NfProxyDataService;
+import org.onap.cps.ncmp.api.NetworkCmProxyDataService;
 import org.onap.cps.spi.FetchDescendantsOption;
 import org.onap.cps.spi.model.DataNode;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 @Service
-public class NfProxyDataServiceImpl implements NfProxyDataService {
+public class NetworkCmProxyDataServiceImpl implements NetworkCmProxyDataService {
 
     private static final String NF_PROXY_DATASPACE_NAME = "NFP-Operational";
 
@@ -21,12 +21,12 @@ package org.onap.cps.api.impl
 
 import org.onap.cps.api.CpsDataService
 import org.onap.cps.api.CpsQueryService
-import org.onap.cps.nfproxy.api.impl.NfProxyDataServiceImpl
+import org.onap.cps.ncmp.api.impl.NetworkCmProxyDataServiceImpl
 import org.onap.cps.spi.FetchDescendantsOption
 import spock.lang.Specification
 
-class NfProxyDataServiceImplSpec extends Specification {
-    def objectUnderTest = new NfProxyDataServiceImpl()
+class NetworkCmProxyDataServiceImplSpec extends Specification {
+    def objectUnderTest = new NetworkCmProxyDataServiceImpl()
     def mockcpsDataService = Mock(CpsDataService)
     def mockcpsQueryService = Mock(CpsQueryService)
 
diff --git a/cps-nf-proxy-rest/docs/openapi/openapi.yml b/cps-nf-proxy-rest/docs/openapi/openapi.yml
deleted file mode 100755 (executable)
index a6d0949..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-openapi: 3.0.1
-info:
-  title: xNF to CPS Proxy API
-  description: xNF to CPS Proxy API
-  version: "1.0"
-servers:
-  - url: //localhost:8088/
-paths:
-  /v1/cm-handles/{cm-handle}/node:
-    $ref: 'xnfProxy.yml#/nodeByCmHandleAndXpath'
-
-  /v1/cm-handles/{cm-handle}/nodes/query:
-    $ref: 'xnfProxy.yml#/nodesByCmHandleAndCpsPath'
-
-  /v1/cm-handles/{cm-handle}/nodes:
-    $ref: 'xnfProxy.yml#/nodesByCmHandleAndXpath'
\ No newline at end of file
diff --git a/cps-nf-proxy-rest/pom.xml b/cps-nf-proxy-rest/pom.xml
deleted file mode 100755 (executable)
index 1add0a0..0000000
+++ /dev/null
@@ -1,113 +0,0 @@
-<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-    <parent>
-        <groupId>org.onap.cps</groupId>
-        <artifactId>cps-parent</artifactId>
-        <version>1.1.0-SNAPSHOT</version>
-        <relativePath>../cps-parent/pom.xml</relativePath>
-    </parent>
-
-    <artifactId>cps-nf-proxy-rest</artifactId>
-
-    <properties>
-        <minimum-coverage>0.0</minimum-coverage>
-    </properties>
-
-    <dependencies>
-        <dependency>
-            <groupId>${project.groupId}</groupId>
-            <artifactId>cps-nf-proxy-service</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-tomcat</artifactId>
-                </exclusion>
-            </exclusions>
-        </dependency>
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-jetty</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>io.swagger.core.v3</groupId>
-            <artifactId>swagger-annotations</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>io.springfox</groupId>
-            <artifactId>springfox-boot-starter</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>io.swagger</groupId>
-            <artifactId>swagger-annotations</artifactId>
-        </dependency>
-        <!-- T E S T   D E P E N D E N C I E S -->
-        <dependency>
-            <groupId>org.codehaus.groovy</groupId>
-            <artifactId>groovy</artifactId>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.spockframework</groupId>
-            <artifactId>spock-core</artifactId>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.spockframework</groupId>
-            <artifactId>spock-spring</artifactId>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>cglib</groupId>
-            <artifactId>cglib-nodep</artifactId>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-test</artifactId>
-            <scope>test</scope>
-            <exclusions>
-                <exclusion>
-                    <groupId>org.junit.vintage</groupId>
-                    <artifactId>junit-vintage-engine</artifactId>
-                </exclusion>
-            </exclusions>
-        </dependency>
-    </dependencies>
-
-    <build>
-        <plugins>
-            <!-- Swagger code generation. -->
-            <plugin>
-                <groupId>io.swagger.codegen.v3</groupId>
-                <artifactId>swagger-codegen-maven-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <goals>
-                            <goal>generate</goal>
-                        </goals>
-                        <configuration>
-                            <inputSpec>${project.basedir}/docs/openapi/openapi.yml</inputSpec>
-                            <invokerPackage>org.onap.cps.nfproxy.rest.controller</invokerPackage>
-                            <modelPackage>org.onap.cps.nfproxy.rest.model</modelPackage>
-                            <apiPackage>org.onap.cps.nfproxy.rest.api</apiPackage>
-                            <language>spring</language>
-                            <generateSupportingFiles>false</generateSupportingFiles>
-                            <configOptions>
-                                <sourceFolder>src/gen/java</sourceFolder>
-                                <dateLibrary>java11</dateLibrary>
-                                <interfaceOnly>true</interfaceOnly>
-                                <useTags>true</useTags>
-                            </configOptions>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-        </plugins>
-    </build>
-</project>
diff --git a/cps-nf-proxy-rest/src/test/resources/application.yml b/cps-nf-proxy-rest/src/test/resources/application.yml
deleted file mode 100644 (file)
index fed1559..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-
-rest:
-    api:
-        xnf-base-path: /xnf-proxy/api
-spring:
diff --git a/cps-nf-proxy-service/pom.xml b/cps-nf-proxy-service/pom.xml
deleted file mode 100644 (file)
index 38e79f7..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-<?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.cps</groupId>
-        <artifactId>cps-parent</artifactId>
-        <version>1.1.0-SNAPSHOT</version>
-        <relativePath>../cps-parent/pom.xml</relativePath>
-    </parent>
-
-    <artifactId>cps-nf-proxy-service</artifactId>
-
-    <properties>
-        <minimum-coverage>0.0</minimum-coverage>
-    </properties>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-validation</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>${project.groupId}</groupId>
-            <artifactId>cps-service</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.spockframework</groupId>
-            <artifactId>spock-core</artifactId>
-            <scope>test</scope>
-        </dependency>
-    </dependencies>
-</project>
\ No newline at end of file
index 6536cc8..b76cd2d 100755 (executable)
@@ -60,8 +60,8 @@
             ../cps-service/target/site/jacoco-aggregate/jacoco.xml,
             ../cps-rest/target/site/jacoco-ut/jacoco.xml,
             ../cps-rest/target/site/jacoco-aggregate/jacoco.xml,
-            ../cps-nf-proxy-rest/target/site/jacoco-ut/jacoco.xml,
-            ../cps-nf-proxy-rest/target/site/jacoco-aggregate/jacoco.xml,
+            ../cps-ncmp-rest/target/site/jacoco-ut/jacoco.xml,
+            ../cps-ncmp-rest/target/site/jacoco-aggregate/jacoco.xml,
             ../cps-application/target/site/jacoco-ut/jacoco.xml,
             ../cps-application/target/site/jacoco-aggregate/jacoco.xml
         </sonar.coverage.jacoco.xmlReportPaths>
index 1b8f196..edc56e4 100755 (executable)
@@ -2,6 +2,7 @@
  * ============LICENSE_START=======================================================
  *  Copyright (C) 2020 Nordix Foundation. All rights reserved.
  *  Modifications Copyright (C) 2020 Bell Canada. All rights reserved.
+ *  Modifications Copyright (C) 2021 Pantheon.tech
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
 
 package org.onap.cps.spi.impl;
 
+import com.google.common.collect.ImmutableSet;
 import java.util.Collection;
 import java.util.stream.Collectors;
+import javax.transaction.Transactional;
 import org.onap.cps.spi.CpsAdminPersistenceService;
 import org.onap.cps.spi.entities.AnchorEntity;
 import org.onap.cps.spi.entities.DataspaceEntity;
@@ -31,6 +34,7 @@ import org.onap.cps.spi.exceptions.AlreadyDefinedException;
 import org.onap.cps.spi.model.Anchor;
 import org.onap.cps.spi.repository.AnchorRepository;
 import org.onap.cps.spi.repository.DataspaceRepository;
+import org.onap.cps.spi.repository.FragmentRepository;
 import org.onap.cps.spi.repository.SchemaSetRepository;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.dao.DataIntegrityViolationException;
@@ -48,6 +52,9 @@ public class CpsAdminPersistenceServiceImpl implements CpsAdminPersistenceServic
     @Autowired
     private SchemaSetRepository schemaSetRepository;
 
+    @Autowired
+    private FragmentRepository fragmentRepository;
+
     @Override
     public void createDataspace(final String dataspaceName) {
         try {
@@ -83,10 +90,20 @@ public class CpsAdminPersistenceServiceImpl implements CpsAdminPersistenceServic
 
     @Override
     public Anchor getAnchor(final String dataspaceName, final String anchorName) {
+        return toAnchor(getAnchorEntity(dataspaceName, anchorName));
+    }
+
+    @Transactional
+    @Override
+    public void deleteAnchor(final String dataspaceName, final String anchorName) {
+        final AnchorEntity anchorEntity = getAnchorEntity(dataspaceName, anchorName);
+        fragmentRepository.deleteByAnchorIn(ImmutableSet.of(anchorEntity));
+        anchorRepository.delete(anchorEntity);
+    }
+
+    private AnchorEntity getAnchorEntity(final String dataspaceName, final String anchorName) {
         final DataspaceEntity dataspaceEntity = dataspaceRepository.getByName(dataspaceName);
-        final AnchorEntity anchorEntity =
-            anchorRepository.getByDataspaceAndName(dataspaceEntity, anchorName);
-        return toAnchor(anchorEntity);
+        return anchorRepository.getByDataspaceAndName(dataspaceEntity, anchorName);
     }
 
     private static Anchor toAnchor(final AnchorEntity anchorEntity) {
index 7ab099d..0d75d3f 100644 (file)
@@ -1,6 +1,7 @@
 /*
  * ============LICENSE_START=======================================================
  *  Copyright (C) 2021 Nordix Foundation
+ *  Modifications Copyright (C) 2021 Pantheon.tech
  *  ================================================================================
  *  Licensed under the Apache License, Version 2.0 (the "License");
  *  you may not use this file except in compliance with the License.
@@ -36,6 +37,8 @@ class CpsAdminPersistenceServiceSpec extends CpsPersistenceSpecBase {
 
     static final String SET_DATA = '/data/anchor.sql'
     static final String EMPTY_DATASPACE_NAME = 'DATASPACE-002'
+    static final Integer DELETED_ANCHOR_ID = 3001
+    static final Long DELETED_FRAGMENT_ID = 4001
 
     @Sql(CLEAR_DATA)
     def 'Create and retrieve a new dataspace.'() {
@@ -77,10 +80,10 @@ class CpsAdminPersistenceServiceSpec extends CpsPersistenceSpecBase {
         then: 'an #expectedException is thrown'
             thrown(expectedException)
         where: 'the following data is used'
-            scenario                    | dataspaceName  | schemaSetName     | anchorName     || expectedException
-            'dataspace does not exist'  | 'unknown'      | 'not-relevant'    | 'not-relevant' || DataspaceNotFoundException
-            'schema set does not exist' | DATASPACE_NAME | 'unknown'         | 'not-relevant' || SchemaSetNotFoundException
-            'anchor already exists'     | DATASPACE_NAME |  SCHEMA_SET_NAME1 | ANCHOR_NAME1   || AlreadyDefinedException
+            scenario                    | dataspaceName  | schemaSetName    | anchorName     || expectedException
+            'dataspace does not exist'  | 'unknown'      | 'not-relevant'   | 'not-relevant' || DataspaceNotFoundException
+            'schema set does not exist' | DATASPACE_NAME | 'unknown'        | 'not-relevant' || SchemaSetNotFoundException
+            'anchor already exists'     | DATASPACE_NAME | SCHEMA_SET_NAME1 | ANCHOR_NAME1   || AlreadyDefinedException
     }
 
     @Unroll
@@ -91,9 +94,9 @@ class CpsAdminPersistenceServiceSpec extends CpsPersistenceSpecBase {
         then: 'an #expectedException is thrown'
             thrown(expectedException)
         where: 'the following data is used'
-            scenario                    | dataspaceName  | anchorName     || expectedException
-            'dataspace does not exist'  | 'unknown'      | 'not-relevant' || DataspaceNotFoundException
-            'anchor does not exists'    | DATASPACE_NAME | 'unknown'      || AnchorNotFoundException
+            scenario                   | dataspaceName  | anchorName     || expectedException
+            'dataspace does not exist' | 'unknown'      | 'not-relevant' || DataspaceNotFoundException
+            'anchor does not exists'   | DATASPACE_NAME | 'unknown'      || AnchorNotFoundException
     }
 
     @Unroll
@@ -118,4 +121,26 @@ class CpsAdminPersistenceServiceSpec extends CpsPersistenceSpecBase {
         then: 'an DataspaceNotFoundException is thrown'
             thrown(DataspaceNotFoundException)
     }
+
+    @Sql([CLEAR_DATA, SET_DATA])
+    def 'Delete anchor'() {
+        when: 'delete anchor action is invoked'
+            objectUnderTest.deleteAnchor(DATASPACE_NAME, ANCHOR_NAME1)
+        then: 'anchor and associated data fragment are deleted'
+            assert anchorRepository.findById(DELETED_ANCHOR_ID).isEmpty()
+            assert fragmentRepository.findById(DELETED_FRAGMENT_ID).isEmpty()
+    }
+
+    @Unroll
+    @Sql([CLEAR_DATA, SET_DATA])
+    def 'delete anchor error scenario: #scenario'(){
+        when: 'delete anchor attempt is performed'
+            objectUnderTest.deleteAnchor(dataspaceName, anchorName)
+        then: 'an #expectedException is thrown'
+            thrown(expectedException)
+        where: 'the following data is used'
+            scenario                   | dataspaceName  | anchorName     || expectedException
+            'dataspace does not exist' | 'unknown'      | 'not-relevant' || DataspaceNotFoundException
+            'anchor does not exists'   | DATASPACE_NAME | 'unknown'      || AnchorNotFoundException
+    }
 }
index 1d9b4b1..a7d3e67 100644 (file)
@@ -6,4 +6,7 @@ INSERT INTO SCHEMA_SET (ID, NAME, DATASPACE_ID) VALUES
 
 INSERT INTO ANCHOR (ID, NAME, DATASPACE_ID, SCHEMA_SET_ID) VALUES
     (3001, 'ANCHOR-001', 1001, 2001),
-    (3002, 'ANCHOR-002', 1001, 2002);
\ No newline at end of file
+    (3002, 'ANCHOR-002', 1001, 2002);
+
+INSERT INTO FRAGMENT (ID, DATASPACE_ID, ANCHOR_ID, PARENT_ID, XPATH, ATTRIBUTES) VALUES
+    (4001, 1001, 3001, null, '/xpath', '{}');
\ No newline at end of file
index 0379ac2..1e4c9c7 100755 (executable)
@@ -2,6 +2,7 @@
  * ============LICENSE_START=======================================================
  *  Copyright (C) 2020 Nordix Foundation
  *  Modifications Copyright (C) 2020 Bell Canada. All rights reserved.
+ *  Modifications Copyright (C) 2021 Pantheon.tech
  *  ================================================================================
  *  Licensed under the Apache License, Version 2.0 (the "License");
  *  you may not use this file except in compliance with the License.
@@ -62,9 +63,17 @@ public interface CpsAdminService {
      * Get an anchor in the given dataspace using the anchor name.
      *
      * @param dataspaceName dataspace name
-     * @param anchorName anchor name
+     * @param anchorName    anchor name
      * @return an anchor
      */
     @NonNull
     Anchor getAnchor(@NonNull String dataspaceName, @NonNull String anchorName);
+
+    /**
+     * Delete anchor by name in given dataspace.
+     *
+     * @param dataspaceName dataspace name
+     * @param anchorName    anchor name
+     */
+    void deleteAnchor(@NonNull String dataspaceName, @NonNull String anchorName);
 }
index 09550f1..2518573 100755 (executable)
@@ -2,6 +2,7 @@
  * ============LICENSE_START=======================================================
  *  Copyright (C) 2020 Nordix Foundation
  *  Modifications Copyright (C) 2020 Bell Canada. All rights reserved.
+ *  Modifications Copyright (C) 2021 Pantheon.tech
  *  ================================================================================
  *  Licensed under the Apache License, Version 2.0 (the "License");
  *  you may not use this file except in compliance with the License.
@@ -52,4 +53,9 @@ public class CpsAdminServiceImpl implements CpsAdminService {
     public Anchor getAnchor(final String dataspaceName, final String anchorName) {
         return cpsAdminPersistenceService.getAnchor(dataspaceName, anchorName);
     }
+
+    @Override
+    public void deleteAnchor(final String dataspaceName, final String anchorName) {
+        cpsAdminPersistenceService.deleteAnchor(dataspaceName, anchorName);
+    }
 }
\ No newline at end of file
index f47af5f..35e07f8 100755 (executable)
@@ -2,6 +2,7 @@
  * ============LICENSE_START=======================================================
  *  Copyright (C) 2020 Nordix Foundation. All rights reserved.
  *  Modifications Copyright (C) 2020 Bell Canada. All rights reserved.
+ *  Modifications Copyright (C) 2021 Pantheon.tech
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -67,4 +68,12 @@ public interface CpsAdminPersistenceService {
      */
     @NonNull
     Anchor getAnchor(@NonNull String dataspaceName, @NonNull String anchorName);
+
+    /**
+     * Delete anchor by name in given dataspace.
+     *
+     * @param dataspaceName dataspace name
+     * @param anchorName anchor name
+     */
+    void deleteAnchor(@NonNull String dataspaceName, @NonNull String anchorName);
 }
\ No newline at end of file
index ea0626c..cf79ad7 100644 (file)
@@ -30,6 +30,7 @@ import java.util.Set;
 import java.util.stream.Collectors;
 import lombok.extern.slf4j.Slf4j;
 import org.onap.cps.utils.YangUtils;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.api.schema.DataContainerChild;
 import org.opendaylight.yangtools.yang.data.api.schema.DataContainerNode;
 import org.opendaylight.yangtools.yang.data.api.schema.LeafSetNode;
@@ -150,8 +151,10 @@ public class DataNodeBuilder {
     }
 
     private static void addYangContainer(final DataNode currentDataNode, final DataContainerNode<?> dataContainerNode) {
-        final DataNode dataContainerDataNode = createAndAddChildDataNode(currentDataNode,
-            YangUtils.buildXpath(dataContainerNode.getIdentifier()));
+        final DataNode dataContainerDataNode =
+            (dataContainerNode.getIdentifier() instanceof YangInstanceIdentifier.AugmentationIdentifier)
+                ? currentDataNode
+                : createAndAddChildDataNode(currentDataNode, YangUtils.buildXpath(dataContainerNode.getIdentifier()));
         final Collection<DataContainerChild<?, ?>> normalizedChildNodes = dataContainerNode.getValue();
         for (final NormalizedNode<?, ?> normalizedNode : normalizedChildNodes) {
             addDataNodeFromNormalizedNode(dataContainerDataNode, normalizedNode);
index 6631a20..b1fc4dc 100755 (executable)
@@ -2,6 +2,7 @@
  * ============LICENSE_START=======================================================
  *  Copyright (C) 2020 Nordix Foundation
  *  Modifications Copyright (C) 2020 Bell Canada. All rights reserved.
+ *  Modifications Copyright (C) 2021 Pantheon.tech
  *  ================================================================================
  *  Licensed under the Apache License, Version 2.0 (the "License");
  *  you may not use this file except in compliance with the License.
@@ -61,4 +62,11 @@ class CpsAdminServiceImplSpec extends Specification {
         expect: 'the anchor provided by persistence service is returned as result'
             objectUnderTest.getAnchor('someDataspace','someAnchor') == anchor
     }
+
+    def 'Delete anchor.'() {
+        when: 'delete anchor is invoked'
+            objectUnderTest.deleteAnchor('someDataspace','someAnchor')
+        then: 'associated persistence service method is invoked with same parameters'
+             1 * mockCpsAdminPersistenceService.deleteAnchor('someDataspace','someAnchor')
+    }
 }
index a24bd0a..a09166d 100755 (executable)
@@ -52,7 +52,11 @@ class E2ENetworkSliceSpec extends Specification {
 \r
     def 'E2E model can be parsed by CPS.'() {\r
         given: 'Valid yang resource as name-to-content map'\r
-            def yangResourcesNameToContentMap = TestUtils.getYangResourcesAsMap('e2e/basic/ietf-inet-types.yang','e2e/basic/ietf-yang-types.yang','e2e/basic/ran-network2020-08-06.yang')\r
+            def yangResourcesNameToContentMap = TestUtils.getYangResourcesAsMap(\r
+                    'ietf/ietf-inet-types@2013-07-15.yang',\r
+                    'ietf/ietf-yang-types@2013-07-15.yang',\r
+                    'e2e/basic/ran-network2020-08-06.yang'\r
+            )\r
         when: 'Create schema set method is invoked'\r
             cpsModuleServiceImpl.createSchemaSet(dataspaceName, schemaSetName, yangResourcesNameToContentMap)\r
         then: 'Parameters are validated and processing is delegated to persistence service'\r
@@ -144,8 +148,8 @@ class E2ENetworkSliceSpec extends Specification {
     def 'E2E RAN Schema Model.'(){\r
         given: 'yang resources'\r
             def yangResourcesNameToContentMap = TestUtils.getYangResourcesAsMap(\r
-                    'e2e/basic/ietf-inet-types.yang',\r
-                    'e2e/basic/ietf-yang-types.yang',\r
+                    'ietf/ietf-inet-types@2013-07-15.yang',\r
+                    'ietf/ietf-yang-types@2013-07-15.yang',\r
                     'e2e/basic/cps-ran-schema-model@2021-01-28.yang'\r
             )\r
         and : 'json data'\r
index dca648b..901e0b6 100644 (file)
@@ -35,6 +35,15 @@ class DataNodeBuilderSpec extends Specification {
             '/test-tree/branch[@name=\'Right\']/nest': [name: 'Big', birds: ['Owl', 'Raven', 'Crow']]
     ]
 
+    String[] networkTopologyModelRfc8345 = [
+            'ietf/ietf-yang-types@2013-07-15.yang',
+            'ietf/ietf-network-topology-state@2018-02-26.yang',
+            'ietf/ietf-network-topology@2018-02-26.yang',
+            'ietf/ietf-network-state@2018-02-26.yang',
+            'ietf/ietf-network@2018-02-26.yang',
+            'ietf/ietf-inet-types@2013-07-15.yang'
+    ]
+
     def 'Converting NormalizedNode (tree) to a DataNode (tree).'() {
         given: 'the schema context for expected model'
             def yangResourceNameToContent = TestUtils.getYangResourcesAsMap('test-tree.yang')
@@ -74,6 +83,55 @@ class DataNodeBuilderSpec extends Specification {
             mappedResult.keySet()
                     .containsAll(['/test-tree/branch[@name=\'Branch\']', '/test-tree/branch[@name=\'Branch\']/nest'])
     }
+    def 'Converting NormalizedNode (tree) to a DataNode (tree) -- augmentation case.'() {
+        given: 'a schema context for expected model'
+            def yangResourceNameToContent = TestUtils.getYangResourcesAsMap(networkTopologyModelRfc8345)
+            def schemaContext = YangTextSchemaSourceSetBuilder.of(yangResourceNameToContent) getSchemaContext()
+        and: 'the json data parsed into normalized node object'
+            def jsonData = TestUtils.getResourceFileContent('ietf/data/ietf-network-topology-sample-rfc8345.json')
+            def normalizedNode = YangUtils.parseJsonData(jsonData, schemaContext)
+        when: 'the normalized node is converted to a data node '
+            def result = new DataNodeBuilder().withNormalizedNodeTree(normalizedNode).build()
+            def mappedResult = TestUtils.getFlattenMapByXpath(result)
+        then: 'all expected data nodes are populated'
+            mappedResult.size() == 32
+            println(mappedResult.keySet().sort())
+        and: 'xpaths for augmentation nodes (link and termination-point nodes) were built correctly'
+            mappedResult.keySet().containsAll([
+                    "/networks/network[@network-id='otn-hc']/link[@link-id='D1,1-2-1,D2,2-1-1']",
+                    "/networks/network[@network-id='otn-hc']/link[@link-id='D1,1-3-1,D3,3-1-1']",
+                    "/networks/network[@network-id='otn-hc']/link[@link-id='D2,2-1-1,D1,1-2-1']",
+                    "/networks/network[@network-id='otn-hc']/link[@link-id='D2,2-3-1,D3,3-2-1']",
+                    "/networks/network[@network-id='otn-hc']/link[@link-id='D3,3-1-1,D1,1-3-1']",
+                    "/networks/network[@network-id='otn-hc']/link[@link-id='D3,3-2-1,D2,2-3-1']",
+                    "/networks/network[@network-id='otn-hc']/node[@node-id='D1']/termination-point[@tp-id='1-0-1']",
+                    "/networks/network[@network-id='otn-hc']/node[@node-id='D1']/termination-point[@tp-id='1-2-1']",
+                    "/networks/network[@network-id='otn-hc']/node[@node-id='D1']/termination-point[@tp-id='1-3-1']",
+                    "/networks/network[@network-id='otn-hc']/node[@node-id='D2']/termination-point[@tp-id='2-0-1']",
+                    "/networks/network[@network-id='otn-hc']/node[@node-id='D2']/termination-point[@tp-id='2-1-1']",
+                    "/networks/network[@network-id='otn-hc']/node[@node-id='D2']/termination-point[@tp-id='2-3-1']",
+                    "/networks/network[@network-id='otn-hc']/node[@node-id='D3']/termination-point[@tp-id='3-1-1']",
+                    "/networks/network[@network-id='otn-hc']/node[@node-id='D3']/termination-point[@tp-id='3-2-1']"
+            ])
+    }
+
+    def 'Converting NormalizedNode (tree) to a DataNode (tree) for known parent node -- augmentation case.'() {
+        given: 'a schema context for expected model'
+            def yangResourceNameToContent = TestUtils.getYangResourcesAsMap(networkTopologyModelRfc8345)
+            def schemaContext = YangTextSchemaSourceSetBuilder.of(yangResourceNameToContent) getSchemaContext()
+        and: 'parent node xpath referencing augmentation node within a model'
+            def parentNodeXpath = "/networks/network[@network-id='otn-hc']/link[@link-id='D1,1-2-1,D2,2-1-1']"
+        and: 'the json data fragment parsed into normalized node object for given parent node xpath'
+            def jsonData = '{"source": {"source-node": "D1", "source-tp": "1-2-1"}}'
+            def normalizedNode = YangUtils.parseJsonData(jsonData, schemaContext, parentNodeXpath)
+        when: 'the normalized node is converted to a data node with given parent node xpath'
+            def result = new DataNodeBuilder().withNormalizedNodeTree(normalizedNode)
+                    .withParentNodeXpath(parentNodeXpath).build()
+        then: 'the resulting data node represents a child of augmentation node'
+            assert result.xpath == "/networks/network[@network-id='otn-hc']/link[@link-id='D1,1-2-1,D2,2-1-1']/source"
+            assert result.leaves['source-node'] == 'D1'
+            assert result.leaves['source-tp'] == '1-2-1'
+    }
 
     def static assertLeavesMaps(actualLeavesMap, expectedLeavesMap) {
         expectedLeavesMap.each { key, value ->
@@ -88,5 +146,4 @@ class DataNodeBuilderSpec extends Specification {
             }
         }
     }
-
 }
diff --git a/cps-service/src/test/resources/ietf/data/ietf-network-topology-sample-rfc8345.json b/cps-service/src/test/resources/ietf/data/ietf-network-topology-sample-rfc8345.json
new file mode 100644 (file)
index 0000000..8f2ee02
--- /dev/null
@@ -0,0 +1,120 @@
+{
+     "ietf-network:networks": {
+       "network": [
+         {
+           "network-types": {
+           },
+           "network-id": "otn-hc",
+           "node": [
+             {
+               "node-id": "D1",
+               "termination-point": [
+                 {
+                   "tp-id": "1-0-1"
+                 },
+                 {
+                   "tp-id": "1-2-1"
+                 },
+                 {
+                   "tp-id": "1-3-1"
+                 }
+               ]
+             },
+             {
+               "node-id": "D2",
+               "termination-point": [
+                 {
+                   "tp-id": "2-0-1"
+                 },
+                 {
+                   "tp-id": "2-1-1"
+                 },
+                 {
+                   "tp-id": "2-3-1"
+                 }
+               ]
+             },
+             {
+               "node-id": "D3",
+               "termination-point": [
+                 {
+                   "tp-id": "3-1-1"
+                 },
+                 {
+                   "tp-id": "3-2-1"
+                 }
+               ]
+             }
+           ],
+           "ietf-network-topology:link": [
+             {
+               "link-id": "D1,1-2-1,D2,2-1-1",
+               "source": {
+                 "source-node": "D1",
+                 "source-tp": "1-2-1"
+               },
+               "destination": {
+                 "dest-node": "D2",
+                 "dest-tp": "2-1-1"
+               }
+             },
+             {
+               "link-id": "D2,2-1-1,D1,1-2-1",
+               "source": {
+                 "source-node": "D2",
+                 "source-tp": "2-1-1"
+               },
+               "destination": {
+                 "dest-node": "D1",
+                 "dest-tp": "1-2-1"
+               }
+             },
+             {
+               "link-id": "D1,1-3-1,D3,3-1-1",
+               "source": {
+                 "source-node": "D1",
+                 "source-tp": "1-3-1"
+               },
+               "destination": {
+                 "dest-node": "D3",
+                 "dest-tp": "3-1-1"
+               }
+             },
+             {
+               "link-id": "D3,3-1-1,D1,1-3-1",
+               "source": {
+                 "source-node": "D3",
+                 "source-tp": "3-1-1"
+               },
+               "destination": {
+                 "dest-node": "D1",
+                 "dest-tp": "1-3-1"
+               }
+             },
+             {
+               "link-id": "D2,2-3-1,D3,3-2-1",
+               "source": {
+                 "source-node": "D2",
+                 "source-tp": "2-3-1"
+               },
+               "destination": {
+                 "dest-node": "D3",
+                 "dest-tp": "3-2-1"
+               }
+             },
+             {
+               "link-id": "D3,3-2-1,D2,2-3-1",
+               "source": {
+                 "source-node": "D3",
+                 "source-tp": "3-2-1"
+               },
+               "destination": {
+                 "dest-node": "D2",
+                 "dest-tp": "2-3-1"
+               }
+             }
+           ]
+         }
+       ]
+     }
+   }
old mode 100755 (executable)
new mode 100644 (file)
similarity index 99%
rename from cps-service/src/test/resources/e2e/basic/ietf-inet-types.yang
rename to cps-service/src/test/resources/ietf/ietf-inet-types@2013-07-15.yang
index 2f14270..eacefb6
@@ -328,6 +328,7 @@ module ietf-inet-types {
             + '((([^:]+:)*[^:]+)?::(([^:]+:)*[^:]+)?)'
             + '(/.+)';
     }
+
     description
      "The ipv6-prefix type represents an IPv6 address prefix.
       The prefix length is given by the number following the
@@ -353,11 +354,11 @@ module ietf-inet-types {
 
   typedef domain-name {
     type string {
-      length "1..253";
       pattern
         '((([a-zA-Z0-9_]([a-zA-Z0-9\-_]){0,61})?[a-zA-Z0-9]\.)*'
       + '([a-zA-Z0-9_]([a-zA-Z0-9\-_]){0,61})?[a-zA-Z0-9]\.?)'
       + '|\.';
+      length "1..253";
     }
     description
      "The domain-name type represents a DNS domain name.  The
diff --git a/cps-service/src/test/resources/ietf/ietf-network-state@2018-02-26.yang b/cps-service/src/test/resources/ietf/ietf-network-state@2018-02-26.yang
new file mode 100644 (file)
index 0000000..9a6893d
--- /dev/null
@@ -0,0 +1,176 @@
+module ietf-network-state {
+  yang-version 1.1;
+  namespace "urn:ietf:params:xml:ns:yang:ietf-network-state";
+  prefix nw-s;
+
+  import ietf-network {
+    prefix nw;
+    reference
+      "RFC 8345: A YANG Data Model for Network Topologies";
+  }
+
+  organization
+    "IETF I2RS (Interface to the Routing System) Working Group";
+
+  contact
+    "WG Web:    <https://datatracker.ietf.org/wg/i2rs/>
+     WG List:   <mailto:i2rs@ietf.org>
+
+     Editor:    Alexander Clemm
+                <mailto:ludwig@clemm.org>
+
+     Editor:    Jan Medved
+                <mailto:jmedved@cisco.com>
+
+     Editor:    Robert Varga
+                <mailto:robert.varga@pantheon.tech>
+
+     Editor:    Nitin Bahadur
+                <mailto:nitin_bahadur@yahoo.com>
+     Editor:    Hariharan Ananthakrishnan
+                <mailto:hari@packetdesign.com>
+
+     Editor:    Xufeng Liu
+                <mailto:xufeng.liu.ietf@gmail.com>";
+
+  description
+    "This module defines a common base data model for a collection
+     of nodes in a network.  Node definitions are further used
+     in network topologies and inventories.  It represents
+     information that either (1) is learned and automatically
+     populated or (2) results from applying network information
+     that has been configured per the 'ietf-network' data model,
+     mirroring the corresponding data nodes in this data model.
+
+     The data model mirrors 'ietf-network' but contains only
+     read-only state data.  The data model is not needed when the
+     underlying implementation infrastructure supports the Network
+     Management Datastore Architecture (NMDA).
+
+     Copyright (c) 2018 IETF Trust and the persons identified as
+     authors of the code.  All rights reserved.
+
+     Redistribution and use in source and binary forms, with or
+     without modification, is permitted pursuant to, and subject
+     to the license terms contained in, the Simplified BSD License
+     set forth in Section 4.c of the IETF Trust's Legal Provisions
+     Relating to IETF Documents
+     (https://trustee.ietf.org/license-info).
+
+     This version of this YANG module is part of RFC 8345;
+     see the RFC itself for full legal notices.";
+
+  revision 2018-02-26 {
+    description
+      "Initial revision.";
+    reference
+      "RFC 8345: A YANG Data Model for Network Topologies";
+  }
+
+  grouping network-ref {
+    description
+      "Contains the information necessary to reference a network --
+       for example, an underlay network.";
+    leaf network-ref {
+      type leafref {
+        path "/nw-s:networks/nw-s:network/nw-s:network-id";
+      require-instance false;
+      }
+      description
+        "Used to reference a network -- for example, an underlay
+         network.";
+    }
+  }
+
+  grouping node-ref {
+    description
+      "Contains the information necessary to reference a node.";
+    leaf node-ref {
+      type leafref {
+        path "/nw-s:networks/nw-s:network[nw-s:network-id=current()"+
+          "/../network-ref]/nw-s:node/nw-s:node-id";
+        require-instance false;
+      }
+      description
+        "Used to reference a node.
+         Nodes are identified relative to the network that
+         contains them.";
+    }
+    uses network-ref;
+  }
+
+  container networks {
+    config false;
+    description
+      "Serves as a top-level container for a list of networks.";
+    list network {
+      key "network-id";
+      description
+        "Describes a network.
+         A network typically contains an inventory of nodes,
+         topological information (augmented through the
+         network-topology data model), and layering information.";
+      container network-types {
+        description
+          "Serves as an augmentation target.
+           The network type is indicated through corresponding
+           presence containers augmented into this container.";
+      }
+      leaf network-id {
+        type nw:network-id;
+        description
+          "Identifies a network.";
+      }
+      list supporting-network {
+        key "network-ref";
+        description
+          "An underlay network, used to represent layered network
+           topologies.";
+        leaf network-ref {
+          type leafref {
+            path "/nw-s:networks/nw-s:network/nw-s:network-id";
+          require-instance false;
+          }
+          description
+            "References the underlay network.";
+        }
+      }
+
+      list node {
+        key "node-id";
+        description
+          "The inventory of nodes of this network.";
+        leaf node-id {
+          type nw:node-id;
+          description
+            "Uniquely identifies a node within the containing
+             network.";
+        }
+        list supporting-node {
+          key "network-ref node-ref";
+          description
+            "Represents another node that is in an underlay network
+             and that supports this node.  Used to represent layering
+             structure.";
+          leaf network-ref {
+            type leafref {
+              path "../../../nw-s:supporting-network/nw-s:network-ref";
+            require-instance false;
+            }
+            description
+              "References the underlay network of which the
+               underlay node is a part.";
+          }
+          leaf node-ref {
+            type leafref {
+              path "/nw-s:networks/nw-s:network/nw-s:node/nw-s:node-id";
+            require-instance false;
+            }
+            description
+              "References the underlay node itself.";
+          }
+        }
+      }
+    }
+  }
+}
diff --git a/cps-service/src/test/resources/ietf/ietf-network-topology-state@2018-02-26.yang b/cps-service/src/test/resources/ietf/ietf-network-topology-state@2018-02-26.yang
new file mode 100644 (file)
index 0000000..1c1ba1b
--- /dev/null
@@ -0,0 +1,273 @@
+module ietf-network-topology-state {
+  yang-version 1.1;
+  namespace "urn:ietf:params:xml:ns:yang:ietf-network-topology-state";
+  prefix nt-s;
+
+  import ietf-network-state {
+    prefix nw-s;
+    reference
+      "RFC 8345: A YANG Data Model for Network Topologies";
+  }
+  import ietf-network-topology {
+    prefix nt;
+    reference
+      "RFC 8345: A YANG Data Model for Network Topologies";
+  }
+
+  organization
+    "IETF I2RS (Interface to the Routing System) Working Group";
+
+  contact
+    "WG Web:    <https://datatracker.ietf.org/wg/i2rs/>
+     WG List:   <mailto:i2rs@ietf.org>
+
+     Editor:    Alexander Clemm
+                <mailto:ludwig@clemm.org>
+
+     Editor:    Jan Medved
+                <mailto:jmedved@cisco.com>
+
+     Editor:    Robert Varga
+                <mailto:robert.varga@pantheon.tech>
+
+     Editor:    Nitin Bahadur
+                <mailto:nitin_bahadur@yahoo.com>
+
+     Editor:    Hariharan Ananthakrishnan
+                <mailto:hari@packetdesign.com>
+
+     Editor:    Xufeng Liu
+                <mailto:xufeng.liu.ietf@gmail.com>";
+
+  description
+    "This module defines a common base data model for network
+     topology state, representing topology that either (1) is learned
+     or (2) results from applying topology that has been configured
+     per the 'ietf-network-topology' data model, mirroring the
+     corresponding data nodes in this data model.  It augments the
+     base network state data model with links to connect nodes, as
+     well as termination points to terminate links on nodes.
+
+     The data model mirrors 'ietf-network-topology' but contains only
+     read-only state data.  The data model is not needed when the
+     underlying implementation infrastructure supports the Network
+     Management Datastore Architecture (NMDA).
+
+     Copyright (c) 2018 IETF Trust and the persons identified as
+     authors of the code.  All rights reserved.
+
+     Redistribution and use in source and binary forms, with or
+     without modification, is permitted pursuant to, and subject
+     to the license terms contained in, the Simplified BSD License
+     set forth in Section 4.c of the IETF Trust's Legal Provisions
+     Relating to IETF Documents
+     (https://trustee.ietf.org/license-info).
+
+     This version of this YANG module is part of RFC 8345;
+     see the RFC itself for full legal notices.";
+
+  revision 2018-02-26 {
+    description
+      "Initial revision.";
+    reference
+      "RFC 8345: A YANG Data Model for Network Topologies";
+  }
+
+  grouping link-ref {
+    description
+      "References a link in a specific network.  Although this
+       grouping is not used in this module, it is defined here for
+       the convenience of augmenting modules.";
+    leaf link-ref {
+      type leafref {
+        path "/nw-s:networks/nw-s:network[nw-s:network-id=current()"+
+          "/../network-ref]/nt-s:link/nt-s:link-id";
+        require-instance false;
+      }
+      description
+        "A type for an absolute reference to a link instance.
+         (This type should not be used for relative references.
+         In such a case, a relative path should be used instead.)";
+    }
+    uses nw-s:network-ref;
+  }
+
+  grouping tp-ref {
+    description
+      "References a termination point in a specific node.  Although
+       this grouping is not used in this module, it is defined here
+       for the convenience of augmenting modules.";
+    leaf tp-ref {
+      type leafref {
+        path "/nw-s:networks/nw-s:network[nw-s:network-id=current()"+
+          "/../network-ref]/nw-s:node[nw-s:node-id=current()/../"+
+          "node-ref]/nt-s:termination-point/nt-s:tp-id";
+        require-instance false;
+      }
+      description
+        "A type for an absolute reference to a termination point.
+         (This type should not be used for relative references.
+         In such a case, a relative path should be used instead.)";
+    }
+    uses nw-s:node-ref;
+  }
+
+  augment "/nw-s:networks/nw-s:network" {
+    description
+      "Add links to the network data model.";
+    list link {
+      key "link-id";
+      description
+        "A network link connects a local (source) node and
+         a remote (destination) node via a set of the respective
+         node's termination points.  It is possible to have several
+         links between the same source and destination nodes.
+         Likewise, a link could potentially be re-homed between
+         termination points.  Therefore, in order to ensure that we
+         would always know to distinguish between links, every link
+         is identified by a dedicated link identifier.  Note that a
+         link models a point-to-point link, not a multipoint link.";
+      container source {
+        description
+          "This container holds the logical source of a particular
+           link.";
+        leaf source-node {
+          type leafref {
+            path "../../../nw-s:node/nw-s:node-id";
+            require-instance false;
+          }
+          description
+            "Source node identifier.  Must be in the same topology.";
+        }
+        leaf source-tp {
+          type leafref {
+            path "../../../nw-s:node[nw-s:node-id=current()/../"+
+              "source-node]/termination-point/tp-id";
+            require-instance false;
+          }
+          description
+            "This termination point is located within the source node
+             and terminates the link.";
+        }
+      }
+      container destination {
+        description
+          "This container holds the logical destination of a
+           particular link.";
+        leaf dest-node {
+          type leafref {
+            path "../../../nw-s:node/nw-s:node-id";
+          require-instance false;
+          }
+          description
+            "Destination node identifier.  Must be in the same
+             network.";
+        }
+
+        leaf dest-tp {
+          type leafref {
+            path "../../../nw-s:node[nw-s:node-id=current()/../"+
+              "dest-node]/termination-point/tp-id";
+            require-instance false;
+          }
+          description
+            "This termination point is located within the
+             destination node and terminates the link.";
+        }
+      }
+      leaf link-id {
+        type nt:link-id;
+        description
+          "The identifier of a link in the topology.
+           A link is specific to a topology to which it belongs.";
+      }
+      list supporting-link {
+        key "network-ref link-ref";
+        description
+          "Identifies the link or links on which this link depends.";
+        leaf network-ref {
+          type leafref {
+            path "../../../nw-s:supporting-network/nw-s:network-ref";
+          require-instance false;
+          }
+          description
+            "This leaf identifies in which underlay topology
+             the supporting link is present.";
+        }
+        leaf link-ref {
+          type leafref {
+            path "/nw-s:networks/nw-s:network[nw-s:network-id="+
+              "current()/../network-ref]/link/link-id";
+            require-instance false;
+          }
+          description
+            "This leaf identifies a link that is a part
+             of this link's underlay.  Reference loops in which
+             a link identifies itself as its underlay, either
+             directly or transitively, are not allowed.";
+        }
+      }
+    }
+  }
+
+  augment "/nw-s:networks/nw-s:network/nw-s:node" {
+    description
+      "Augments termination points that terminate links.
+       Termination points can ultimately be mapped to interfaces.";
+    list termination-point {
+      key "tp-id";
+      description
+        "A termination point can terminate a link.
+         Depending on the type of topology, a termination point
+         could, for example, refer to a port or an interface.";
+      leaf tp-id {
+        type nt:tp-id;
+        description
+          "Termination point identifier.";
+      }
+      list supporting-termination-point {
+        key "network-ref node-ref tp-ref";
+        description
+          "This list identifies any termination points on which a
+           given termination point depends or onto which it maps.
+           Those termination points will themselves be contained
+           in a supporting node.  This dependency information can be
+           inferred from the dependencies between links.  Therefore,
+           this item is not separately configurable.  Hence, no
+           corresponding constraint needs to be articulated.
+           The corresponding information is simply provided by the
+           implementing system.";
+        leaf network-ref {
+          type leafref {
+            path "../../../nw-s:supporting-node/nw-s:network-ref";
+          require-instance false;
+          }
+          description
+            "This leaf identifies in which topology the
+             supporting termination point is present.";
+        }
+        leaf node-ref {
+          type leafref {
+            path "../../../nw-s:supporting-node/nw-s:node-ref";
+          require-instance false;
+          }
+          description
+            "This leaf identifies in which node the supporting
+             termination point is present.";
+        }
+
+        leaf tp-ref {
+          type leafref {
+            path "/nw-s:networks/nw-s:network[nw-s:network-id="+
+              "current()/../network-ref]/nw-s:node[nw-s:node-id="+
+              "current()/../node-ref]/termination-point/tp-id";
+            require-instance false;
+          }
+          description
+            "Reference to the underlay node (the underlay node must
+             be in a different topology).";
+        }
+      }
+    }
+  }
+}
diff --git a/cps-service/src/test/resources/ietf/ietf-network-topology@2018-02-26.yang b/cps-service/src/test/resources/ietf/ietf-network-topology@2018-02-26.yang
new file mode 100644 (file)
index 0000000..1ec944d
--- /dev/null
@@ -0,0 +1,294 @@
+module ietf-network-topology {
+  yang-version 1.1;
+  namespace "urn:ietf:params:xml:ns:yang:ietf-network-topology";
+  prefix nt;
+
+  import ietf-inet-types {
+    prefix inet;
+    reference
+      "RFC 6991: Common YANG Data Types";
+  }
+  import ietf-network {
+    prefix nw;
+    reference
+      "RFC 8345: A YANG Data Model for Network Topologies";
+  }
+
+  organization
+    "IETF I2RS (Interface to the Routing System) Working Group";
+
+  contact
+    "WG Web:    <https://datatracker.ietf.org/wg/i2rs/>
+     WG List:   <mailto:i2rs@ietf.org>
+
+     Editor:    Alexander Clemm
+                <mailto:ludwig@clemm.org>
+
+     Editor:    Jan Medved
+                <mailto:jmedved@cisco.com>
+
+     Editor:    Robert Varga
+                <mailto:robert.varga@pantheon.tech>
+
+     Editor:    Nitin Bahadur
+                <mailto:nitin_bahadur@yahoo.com>
+
+     Editor:    Hariharan Ananthakrishnan
+                <mailto:hari@packetdesign.com>
+
+     Editor:    Xufeng Liu
+                <mailto:xufeng.liu.ietf@gmail.com>";
+
+  description
+    "This module defines a common base model for a network topology,
+     augmenting the base network data model with links to connect
+     nodes, as well as termination points to terminate links
+     on nodes.
+
+     Copyright (c) 2018 IETF Trust and the persons identified as
+     authors of the code.  All rights reserved.
+
+     Redistribution and use in source and binary forms, with or
+     without modification, is permitted pursuant to, and subject
+     to the license terms contained in, the Simplified BSD License
+     set forth in Section 4.c of the IETF Trust's Legal Provisions
+     Relating to IETF Documents
+     (https://trustee.ietf.org/license-info).
+
+     This version of this YANG module is part of RFC 8345;
+     see the RFC itself for full legal notices.";
+
+  revision 2018-02-26 {
+    description
+      "Initial revision.";
+    reference
+      "RFC 8345: A YANG Data Model for Network Topologies";
+  }
+
+  typedef link-id {
+    type inet:uri;
+    description
+      "An identifier for a link in a topology.  The precise
+       structure of the link-id will be up to the implementation.
+       The identifier SHOULD be chosen such that the same link in a
+       real network topology will always be identified through the
+       same identifier, even if the data model is instantiated in
+       separate datastores.  An implementation MAY choose to capture
+       semantics in the identifier -- for example, to indicate the
+       type of link and/or the type of topology of which the link is
+       a part.";
+  }
+
+  typedef tp-id {
+    type inet:uri;
+    description
+      "An identifier for termination points on a node.  The precise
+       structure of the tp-id will be up to the implementation.
+       The identifier SHOULD be chosen such that the same termination
+       point in a real network topology will always be identified
+       through the same identifier, even if the data model is
+       instantiated in separate datastores.  An implementation MAY
+       choose to capture semantics in the identifier -- for example,
+       to indicate the type of termination point and/or the type of
+       node that contains the termination point.";
+  }
+
+  grouping link-ref {
+    description
+      "This grouping can be used to reference a link in a specific
+       network.  Although it is not used in this module, it is
+       defined here for the convenience of augmenting modules.";
+    leaf link-ref {
+      type leafref {
+        path "/nw:networks/nw:network[nw:network-id=current()/../"+
+          "network-ref]/nt:link/nt:link-id";
+        require-instance false;
+      }
+      description
+        "A type for an absolute reference to a link instance.
+         (This type should not be used for relative references.
+         In such a case, a relative path should be used instead.)";
+    }
+    uses nw:network-ref;
+  }
+
+  grouping tp-ref {
+    description
+      "This grouping can be used to reference a termination point
+       in a specific node.  Although it is not used in this module,
+       it is defined here for the convenience of augmenting
+       modules.";
+    leaf tp-ref {
+      type leafref {
+        path "/nw:networks/nw:network[nw:network-id=current()/../"+
+          "network-ref]/nw:node[nw:node-id=current()/../"+
+          "node-ref]/nt:termination-point/nt:tp-id";
+        require-instance false;
+      }
+      description
+        "A type for an absolute reference to a termination point.
+         (This type should not be used for relative references.
+         In such a case, a relative path should be used instead.)";
+    }
+    uses nw:node-ref;
+  }
+
+  augment "/nw:networks/nw:network" {
+    description
+      "Add links to the network data model.";
+    list link {
+      key "link-id";
+      description
+        "A network link connects a local (source) node and
+         a remote (destination) node via a set of the respective
+         node's termination points.  It is possible to have several
+         links between the same source and destination nodes.
+         Likewise, a link could potentially be re-homed between
+         termination points.  Therefore, in order to ensure that we
+         would always know to distinguish between links, every link
+         is identified by a dedicated link identifier.  Note that a
+         link models a point-to-point link, not a multipoint link.";
+      leaf link-id {
+        type link-id;
+        description
+          "The identifier of a link in the topology.
+           A link is specific to a topology to which it belongs.";
+      }
+      container source {
+        description
+          "This container holds the logical source of a particular
+           link.";
+        leaf source-node {
+          type leafref {
+            path "../../../nw:node/nw:node-id";
+            require-instance false;
+          }
+          description
+            "Source node identifier.  Must be in the same topology.";
+        }
+        leaf source-tp {
+          type leafref {
+            path "../../../nw:node[nw:node-id=current()/../"+
+              "source-node]/termination-point/tp-id";
+            require-instance false;
+          }
+          description
+            "This termination point is located within the source node
+             and terminates the link.";
+        }
+      }
+
+      container destination {
+        description
+          "This container holds the logical destination of a
+           particular link.";
+        leaf dest-node {
+          type leafref {
+            path "../../../nw:node/nw:node-id";
+          require-instance false;
+          }
+          description
+            "Destination node identifier.  Must be in the same
+             network.";
+        }
+        leaf dest-tp {
+          type leafref {
+            path "../../../nw:node[nw:node-id=current()/../"+
+              "dest-node]/termination-point/tp-id";
+            require-instance false;
+          }
+          description
+            "This termination point is located within the
+             destination node and terminates the link.";
+        }
+      }
+      list supporting-link {
+        key "network-ref link-ref";
+        description
+          "Identifies the link or links on which this link depends.";
+        leaf network-ref {
+          type leafref {
+            path "../../../nw:supporting-network/nw:network-ref";
+          require-instance false;
+          }
+          description
+            "This leaf identifies in which underlay topology
+             the supporting link is present.";
+        }
+
+        leaf link-ref {
+          type leafref {
+            path "/nw:networks/nw:network[nw:network-id=current()/"+
+              "../network-ref]/link/link-id";
+            require-instance false;
+          }
+          description
+            "This leaf identifies a link that is a part
+             of this link's underlay.  Reference loops in which
+             a link identifies itself as its underlay, either
+             directly or transitively, are not allowed.";
+        }
+      }
+    }
+  }
+  augment "/nw:networks/nw:network/nw:node" {
+    description
+      "Augments termination points that terminate links.
+       Termination points can ultimately be mapped to interfaces.";
+    list termination-point {
+      key "tp-id";
+      description
+        "A termination point can terminate a link.
+         Depending on the type of topology, a termination point
+         could, for example, refer to a port or an interface.";
+      leaf tp-id {
+        type tp-id;
+        description
+          "Termination point identifier.";
+      }
+      list supporting-termination-point {
+        key "network-ref node-ref tp-ref";
+        description
+          "This list identifies any termination points on which a
+           given termination point depends or onto which it maps.
+           Those termination points will themselves be contained
+           in a supporting node.  This dependency information can be
+           inferred from the dependencies between links.  Therefore,
+           this item is not separately configurable.  Hence, no
+           corresponding constraint needs to be articulated.
+           The corresponding information is simply provided by the
+           implementing system.";
+
+        leaf network-ref {
+          type leafref {
+            path "../../../nw:supporting-node/nw:network-ref";
+          require-instance false;
+          }
+          description
+            "This leaf identifies in which topology the
+             supporting termination point is present.";
+        }
+        leaf node-ref {
+          type leafref {
+            path "../../../nw:supporting-node/nw:node-ref";
+          require-instance false;
+          }
+          description
+            "This leaf identifies in which node the supporting
+             termination point is present.";
+        }
+        leaf tp-ref {
+          type leafref {
+            path "/nw:networks/nw:network[nw:network-id=current()/"+
+              "../network-ref]/nw:node[nw:node-id=current()/../"+
+              "node-ref]/termination-point/tp-id";
+            require-instance false;
+          }
+          description
+            "Reference to the underlay node (the underlay node must
+             be in a different topology).";
+        }
+      }
+    }
+  }
+}
diff --git a/cps-service/src/test/resources/ietf/ietf-network@2018-02-26.yang b/cps-service/src/test/resources/ietf/ietf-network@2018-02-26.yang
new file mode 100644 (file)
index 0000000..6a03d7e
--- /dev/null
@@ -0,0 +1,192 @@
+module ietf-network {
+  yang-version 1.1;
+  namespace "urn:ietf:params:xml:ns:yang:ietf-network";
+  prefix nw;
+
+  import ietf-inet-types {
+    prefix inet;
+    reference
+      "RFC 6991: Common YANG Data Types";
+  }
+
+  organization
+    "IETF I2RS (Interface to the Routing System) Working Group";
+
+  contact
+    "WG Web:    <https://datatracker.ietf.org/wg/i2rs/>
+     WG List:   <mailto:i2rs@ietf.org>
+
+     Editor:    Alexander Clemm
+                <mailto:ludwig@clemm.org>
+
+     Editor:    Jan Medved
+                <mailto:jmedved@cisco.com>
+
+     Editor:    Robert Varga
+                <mailto:robert.varga@pantheon.tech>
+
+     Editor:    Nitin Bahadur
+                <mailto:nitin_bahadur@yahoo.com>
+
+     Editor:    Hariharan Ananthakrishnan
+                <mailto:hari@packetdesign.com>
+
+     Editor:    Xufeng Liu
+                <mailto:xufeng.liu.ietf@gmail.com>";
+  description
+    "This module defines a common base data model for a collection
+     of nodes in a network.  Node definitions are further used
+     in network topologies and inventories.
+
+     Copyright (c) 2018 IETF Trust and the persons identified as
+     authors of the code.  All rights reserved.
+
+     Redistribution and use in source and binary forms, with or
+     without modification, is permitted pursuant to, and subject
+     to the license terms contained in, the Simplified BSD License
+     set forth in Section 4.c of the IETF Trust's Legal Provisions
+     Relating to IETF Documents
+     (https://trustee.ietf.org/license-info).
+
+     This version of this YANG module is part of RFC 8345;
+     see the RFC itself for full legal notices.";
+
+  revision 2018-02-26 {
+    description
+      "Initial revision.";
+    reference
+      "RFC 8345: A YANG Data Model for Network Topologies";
+  }
+
+  typedef node-id {
+    type inet:uri;
+    description
+      "Identifier for a node.  The precise structure of the node-id
+       will be up to the implementation.  For example, some
+       implementations MAY pick a URI that includes the network-id
+       as part of the path.  The identifier SHOULD be chosen
+       such that the same node in a real network topology will
+       always be identified through the same identifier, even if
+       the data model is instantiated in separate datastores.  An
+       implementation MAY choose to capture semantics in the
+       identifier -- for example, to indicate the type of node.";
+  }
+
+  typedef network-id {
+    type inet:uri;
+    description
+      "Identifier for a network.  The precise structure of the
+       network-id will be up to the implementation.  The identifier
+       SHOULD be chosen such that the same network will always be
+       identified through the same identifier, even if the data model
+       is instantiated in separate datastores.  An implementation MAY
+       choose to capture semantics in the identifier -- for example,
+       to indicate the type of network.";
+  }
+
+  grouping network-ref {
+    description
+      "Contains the information necessary to reference a network --
+       for example, an underlay network.";
+    leaf network-ref {
+      type leafref {
+        path "/nw:networks/nw:network/nw:network-id";
+      require-instance false;
+      }
+      description
+        "Used to reference a network -- for example, an underlay
+         network.";
+    }
+  }
+
+  grouping node-ref {
+    description
+      "Contains the information necessary to reference a node.";
+    leaf node-ref {
+      type leafref {
+        path "/nw:networks/nw:network[nw:network-id=current()/../"+
+          "network-ref]/nw:node/nw:node-id";
+        require-instance false;
+      }
+      description
+        "Used to reference a node.
+         Nodes are identified relative to the network that
+         contains them.";
+    }
+    uses network-ref;
+  }
+
+  container networks {
+    description
+      "Serves as a top-level container for a list of networks.";
+    list network {
+      key "network-id";
+      description
+        "Describes a network.
+         A network typically contains an inventory of nodes,
+         topological information (augmented through the
+         network-topology data model), and layering information.";
+      leaf network-id {
+        type network-id;
+        description
+          "Identifies a network.";
+      }
+      container network-types {
+        description
+          "Serves as an augmentation target.
+           The network type is indicated through corresponding
+           presence containers augmented into this container.";
+      }
+      list supporting-network {
+        key "network-ref";
+        description
+          "An underlay network, used to represent layered network
+           topologies.";
+        leaf network-ref {
+          type leafref {
+            path "/nw:networks/nw:network/nw:network-id";
+          require-instance false;
+          }
+          description
+            "References the underlay network.";
+        }
+      }
+
+      list node {
+        key "node-id";
+        description
+          "The inventory of nodes of this network.";
+        leaf node-id {
+          type node-id;
+          description
+            "Uniquely identifies a node within the containing
+             network.";
+        }
+        list supporting-node {
+          key "network-ref node-ref";
+          description
+            "Represents another node that is in an underlay network
+             and that supports this node.  Used to represent layering
+             structure.";
+          leaf network-ref {
+            type leafref {
+              path "../../../nw:supporting-network/nw:network-ref";
+            require-instance false;
+            }
+            description
+              "References the underlay network of which the
+               underlay node is a part.";
+          }
+          leaf node-ref {
+            type leafref {
+              path "/nw:networks/nw:network/nw:node/nw:node-id";
+            require-instance false;
+            }
+            description
+              "References the underlay node itself.";
+          }
+        }
+      }
+    }
+  }
+}
old mode 100755 (executable)
new mode 100644 (file)
similarity index 99%
rename from cps-service/src/test/resources/e2e/basic/ietf-yang-types.yang
rename to cps-service/src/test/resources/ietf/ietf-yang-types@2013-07-15.yang
index 371a091..ee58fa3
@@ -151,9 +151,6 @@ module ietf-yang-types {
      "The zero-based-counter64 type represents a counter64 that
       has the defined 'initial' value zero.
 
-
-
-
       A schema node of this type will be set to zero (0) on creation
       and will thereafter increase monotonically until it reaches
       a maximum value of 2^64-1 (18446744073709551615 decimal),
@@ -391,9 +388,6 @@ module ietf-yang-types {
       pattern '([0-9a-fA-F]{2}(:[0-9a-fA-F]{2})*)?';
     }
 
-
-
-
     description
      "Represents media- or physical-level addresses represented
       as a sequence octets, each octet represented by two hexadecimal
index 0a38283..3e9cd63 100644 (file)
@@ -6,7 +6,7 @@ Following command builds all Java components to `cps-application/target/cps-appl
 without generating any docker images:  
 
 ```bash
-mvn clean install -Pcps-docker -Pxnf-docker -Pcps-xnf-docker -Djib.skip
+mvn clean install -Pcps-docker -Pncmp-docker -Pcps-ncmp-docker -Djib.skip
 ```
 
 ## Building Java Archive and Docker images
@@ -14,11 +14,11 @@ mvn clean install -Pcps-docker -Pxnf-docker -Pcps-xnf-docker -Djib.skip
 * Following command builds the JAR file and also generates the Docker image for all CPS components:
 
 ```bash
-mvn clean install -Pcps-docker -Pxnf-docker -Pcps-xnf-docker -Dnexus.repository=
+mvn clean install -Pcps-docker -Pncmp-docker -Pcps-ncmp-docker -Dnexus.repository=
 ```
 
 * Following command builds the JAR file and generates the Docker image for specified CPS component:
-  (with `<docker-profile>` being one of `cps-docker`, `xnf-docker` or `cps-xnf-docker`):
+  (with `<docker-profile>` being one of `cps-docker`, `ncmp-docker` or `cps-ncmp-docker`):
 
 ```bash
 mvn clean install -P<docker-profile> -Dnexus.repository=
@@ -29,12 +29,12 @@ mvn clean install -P<docker-profile> -Dnexus.repository=
 `docker-compose/docker-compose.yml` file is provided to be run with `docker-compose` tool and images previously built.
 It starts both Postgres database and CPS services.
 
-1. Edit `docker-compose.yml` and uncomment desired service to be deployed, by default `cps-and-nf-proxy`
-   is enabled. You can comment it and uncomment `cps-standalone` or `nf-proxy-standalone`.
+1. Edit `docker-compose.yml` and uncomment desired service to be deployed, by default `cps-and-ncmp`
+   is enabled. You can comment it and uncomment `cps-standalone` or `ncmp-standalone`.
 2. Execute following command from `docker-compose` folder:
 
 ```bash
-VERSION=x.y.z-SNAPSHOT DB_HOST=dbpostgresql DB_USERNAME=cps DB_PASSWORD=cps docker-compose up -d
+VERSION=x.y.z-SNAPSHOT DB_USERNAME=cps DB_PASSWORD=cps docker-compose up -d
 ```
 
 ## Running or debugging Java built code
@@ -56,8 +56,7 @@ Following command starts the application using JAR file:
 
 ```bash
 DB_HOST=localhost DB_USERNAME=cps DB_PASSWORD=cps \
-  java -classpath cps-application/target/cps-application-x.y.z-SNAPSHOT.jar:docker-compose \
-  org.springframework.boot.loader.JarLauncher
+  java -jar cps-application/target/cps-application-x.y.z-SNAPSHOT.jar
 ```
 
 ### Running from IntelliJ IDE
@@ -66,7 +65,6 @@ Here are the steps to run or debug the application from Intellij:
 
 1. Enable the desired maven profile form Maven Tool Window
 2. Run a configuration from `Run -> Edit configurations` with following settings:
-   * `Working directory`: docker-compose folder, e.g. `$ProjectFileDir$/docker-compose`
    * `Environment variables`: `DB_HOST=localhost;DB_USERNAME=cps;DB_PASSWORD=cps`
 
 ## Accessing services
index a2241bc..0cd4951 100644 (file)
@@ -1,6 +1,7 @@
 # ============LICENSE_START=======================================================
 # Copyright (c) 2020 Pantheon.tech.
 # Modifications Copyright (C) 2021 Bell Canada.
+# Modification (C) 2021 Nordix Foundation
 # ================================================================================
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
@@ -33,9 +34,9 @@ services:
   #  depends_on:
   #    - dbpostgresql
 
-  #nf-proxy-standalone:
-  #  container_name: cps-nf-proxy
-  #  image: cps-nf-proxy:${VERSION}
+  #ncmp-standalone:
+  #  container_name: cps-ncmp
+  #  image: cps-ncmp:${VERSION}
   #  volumes:
   #    - "./application.yml:/app/resources/application.yml"
   #  ports:
@@ -48,15 +49,13 @@ services:
   #  depends_on:
   #    - dbpostgresql
 
-  cps-and-nf-proxy:
-    container_name: cps-and-nf-proxy
-    image: cps-and-nf-proxy:${VERSION}
-    volumes:
-      - "./application.yml:/app/resources/application.yml"
+  cps-and-ncmp:
+    container_name: cps-and-ncmp
+    image: cps-and-ncmp:${VERSION}
     ports:
       - "8883:8080"
     environment:
-      DB_HOST: ${DB_HOST}
+      DB_HOST: dbpostgresql
       DB_USERNAME: ${DB_USERNAME}
       DB_PASSWORD: ${DB_PASSWORD}
     restart: unless-stopped
@@ -71,4 +70,4 @@ services:
     environment:
       POSTGRES_DB: cpsdb
       POSTGRES_USER: ${DB_USERNAME}
-      POSTGRES_PASSWORD: ${DB_PASSWORD}
\ No newline at end of file
+      POSTGRES_PASSWORD: ${DB_PASSWORD}
diff --git a/pom.xml b/pom.xml
index 9fd9bba..f196cba 100644 (file)
--- a/pom.xml
+++ b/pom.xml
@@ -2,6 +2,7 @@
   ============LICENSE_START=======================================================\r
   Copyright (c) 2020 Linux Foundation.\r
   Modifications Copyright (C) 2021 Bell Canada.\r
+  Modification Copyright (C) 2021 Nordix Foundation\r
   ================================================================================\r
   Licensed under the Apache License, Version 2.0 (the "License");\r
   you may not use this file except in compliance with the License.\r
@@ -51,8 +52,8 @@
         <module>cps-parent</module>\r
         <module>cps-service</module>\r
         <module>cps-rest</module>\r
-        <module>cps-nf-proxy-service</module>\r
-        <module>cps-nf-proxy-rest</module>\r
+        <module>cps-ncmp-service</module>\r
+        <module>cps-ncmp-rest</module>\r
         <module>cps-ri</module>\r
         <module>checkstyle</module>\r
         <module>spotbugs</module>\r