From 4408ab05ba1ee07b70d717b7183d76bd718653e5 Mon Sep 17 00:00:00 2001 From: Mehreen Kaleem Date: Mon, 27 Apr 2020 06:11:03 +0000 Subject: Added the base version of the controllers used for the MDONS use case version(1.0.0SNAPSHOT) with test cases. Issue-ID: INT-1532 Change-Id: Ic51448e52722a5edef1ac07a978bb3fdaac07a5d Signed-off-by: Mehreen Kaleem --- .gitignore | 1 + .project | 17 + .settings/org.eclipse.core.resources.prefs | 2 + .settings/org.eclipse.m2e.core.prefs | 4 + README.md | 21 + checkstyle-suppressions.xml | 46 ++ docker-compose.yml | 25 + msasimulator/.classpath | 37 ++ msasimulator/.gitignore | 1 + msasimulator/.project | 23 + .../.settings/org.eclipse.core.resources.prefs | 6 + msasimulator/.settings/org.eclipse.jdt.core.prefs | 5 + msasimulator/.settings/org.eclipse.m2e.core.prefs | 4 + msasimulator/Dockerfile | 9 + msasimulator/README.md | 98 ++++ msasimulator/entrypoint.sh | 4 + msasimulator/json-files/msa-topology.json | 130 ++++++ msasimulator/pom.xml | 306 +++++++++++++ .../java/org/onap/msasimulator/Application.java | 36 ++ .../msasimulator/controller/MsaController.java | 71 +++ .../model/ConfigurationResponseCommon.java | 51 +++ .../onap/msasimulator/model/DirectionDetails.java | 38 ++ .../java/org/onap/msasimulator/model/Link.java | 36 ++ .../model/MsaServiceCreateRequest.java | 64 +++ .../model/MsaServiceDeleteRequest.java | 44 ++ .../msasimulator/model/MsaServiceResponse.java | 40 ++ .../java/org/onap/msasimulator/model/Port.java | 44 ++ .../onap/msasimulator/model/SdncRequestHeader.java | 51 +++ .../onap/msasimulator/model/ServiceDeleteInfo.java | 44 ++ .../onap/msasimulator/model/ServiceEndPoint.java | 71 +++ .../org/onap/msasimulator/service/MsaService.java | 117 +++++ .../java/org/onap/msasimulator/utils/Utils.java | 63 +++ .../src/main/resources/application.properties | 1 + msasimulator/src/main/resources/logback.xml | 28 ++ .../test/java/org/onap/msasimulator/Config.java | 62 +++ .../test/java/org/onap/msasimulator/TestUtils.java | 47 ++ .../msasimulator/controller/TestMsaController.java | 110 +++++ .../onap/msasimulator/service/MsaServiceTest.java | 113 +++++ .../src/test/resources/service-create-failure.json | 54 +++ .../src/test/resources/service-create-success.json | 54 +++ .../src/test/resources/service-delete-request.json | 12 + msasimulator/src/test/resources/topology.json | 130 ++++++ pom.xml | 106 +++++ tapisimulator/.classpath | 36 ++ tapisimulator/.gitignore | 1 + tapisimulator/.project | 23 + .../.settings/org.eclipse.core.resources.prefs | 6 + tapisimulator/.settings/org.eclipse.jdt.core.prefs | 5 + tapisimulator/.settings/org.eclipse.m2e.core.prefs | 4 + tapisimulator/Dockerfile | 9 + tapisimulator/README.md | 87 ++++ tapisimulator/entrypoint.sh | 3 + tapisimulator/json-files/tapi1-siplist.json | 244 ++++++++++ tapisimulator/json-files/tapi1-topology.json | 506 +++++++++++++++++++++ tapisimulator/json-files/tapi2-siplist.json | 244 ++++++++++ tapisimulator/json-files/tapi2-topology.json | 506 +++++++++++++++++++++ tapisimulator/pom.xml | 315 +++++++++++++ .../java/org/onap/tapisimulator/Application.java | 33 ++ .../tapisimulator/controller/TapiController.java | 73 +++ .../java/org/onap/tapisimulator/model/Name.java | 39 ++ .../java/org/onap/tapisimulator/model/Sip.java | 49 ++ .../java/org/onap/tapisimulator/model/SipList.java | 36 ++ .../onap/tapisimulator/service/TapiService.java | 156 +++++++ .../java/org/onap/tapisimulator/utils/Utils.java | 64 +++ .../src/main/resources/application.properties | 0 tapisimulator/src/main/resources/logback.xml | 28 ++ .../test/java/org/onap/tapisimulator/Config.java | 44 ++ .../java/org/onap/tapisimulator/TestUtils.java | 47 ++ .../controller/TestTapiController.java | 103 +++++ .../src/test/resources/service-create-tapi.json | 54 +++ tapisimulator/src/test/resources/siplist.json | 52 +++ .../src/test/resources/tapi-topology.json | 135 ++++++ 72 files changed, 5128 insertions(+) create mode 100644 .project create mode 100644 .settings/org.eclipse.core.resources.prefs create mode 100644 .settings/org.eclipse.m2e.core.prefs create mode 100644 README.md create mode 100644 checkstyle-suppressions.xml create mode 100644 docker-compose.yml create mode 100644 msasimulator/.classpath create mode 100644 msasimulator/.gitignore create mode 100644 msasimulator/.project create mode 100644 msasimulator/.settings/org.eclipse.core.resources.prefs create mode 100644 msasimulator/.settings/org.eclipse.jdt.core.prefs create mode 100644 msasimulator/.settings/org.eclipse.m2e.core.prefs create mode 100644 msasimulator/Dockerfile create mode 100644 msasimulator/README.md create mode 100644 msasimulator/entrypoint.sh create mode 100644 msasimulator/json-files/msa-topology.json create mode 100644 msasimulator/pom.xml create mode 100644 msasimulator/src/main/java/org/onap/msasimulator/Application.java create mode 100644 msasimulator/src/main/java/org/onap/msasimulator/controller/MsaController.java create mode 100644 msasimulator/src/main/java/org/onap/msasimulator/model/ConfigurationResponseCommon.java create mode 100644 msasimulator/src/main/java/org/onap/msasimulator/model/DirectionDetails.java create mode 100644 msasimulator/src/main/java/org/onap/msasimulator/model/Link.java create mode 100644 msasimulator/src/main/java/org/onap/msasimulator/model/MsaServiceCreateRequest.java create mode 100644 msasimulator/src/main/java/org/onap/msasimulator/model/MsaServiceDeleteRequest.java create mode 100644 msasimulator/src/main/java/org/onap/msasimulator/model/MsaServiceResponse.java create mode 100644 msasimulator/src/main/java/org/onap/msasimulator/model/Port.java create mode 100644 msasimulator/src/main/java/org/onap/msasimulator/model/SdncRequestHeader.java create mode 100644 msasimulator/src/main/java/org/onap/msasimulator/model/ServiceDeleteInfo.java create mode 100644 msasimulator/src/main/java/org/onap/msasimulator/model/ServiceEndPoint.java create mode 100644 msasimulator/src/main/java/org/onap/msasimulator/service/MsaService.java create mode 100644 msasimulator/src/main/java/org/onap/msasimulator/utils/Utils.java create mode 100644 msasimulator/src/main/resources/application.properties create mode 100644 msasimulator/src/main/resources/logback.xml create mode 100644 msasimulator/src/test/java/org/onap/msasimulator/Config.java create mode 100644 msasimulator/src/test/java/org/onap/msasimulator/TestUtils.java create mode 100644 msasimulator/src/test/java/org/onap/msasimulator/controller/TestMsaController.java create mode 100644 msasimulator/src/test/java/org/onap/msasimulator/service/MsaServiceTest.java create mode 100644 msasimulator/src/test/resources/service-create-failure.json create mode 100644 msasimulator/src/test/resources/service-create-success.json create mode 100644 msasimulator/src/test/resources/service-delete-request.json create mode 100644 msasimulator/src/test/resources/topology.json create mode 100644 pom.xml create mode 100644 tapisimulator/.classpath create mode 100644 tapisimulator/.gitignore create mode 100644 tapisimulator/.project create mode 100644 tapisimulator/.settings/org.eclipse.core.resources.prefs create mode 100644 tapisimulator/.settings/org.eclipse.jdt.core.prefs create mode 100644 tapisimulator/.settings/org.eclipse.m2e.core.prefs create mode 100644 tapisimulator/Dockerfile create mode 100644 tapisimulator/README.md create mode 100644 tapisimulator/entrypoint.sh create mode 100644 tapisimulator/json-files/tapi1-siplist.json create mode 100644 tapisimulator/json-files/tapi1-topology.json create mode 100644 tapisimulator/json-files/tapi2-siplist.json create mode 100644 tapisimulator/json-files/tapi2-topology.json create mode 100644 tapisimulator/pom.xml create mode 100644 tapisimulator/src/main/java/org/onap/tapisimulator/Application.java create mode 100644 tapisimulator/src/main/java/org/onap/tapisimulator/controller/TapiController.java create mode 100644 tapisimulator/src/main/java/org/onap/tapisimulator/model/Name.java create mode 100644 tapisimulator/src/main/java/org/onap/tapisimulator/model/Sip.java create mode 100644 tapisimulator/src/main/java/org/onap/tapisimulator/model/SipList.java create mode 100644 tapisimulator/src/main/java/org/onap/tapisimulator/service/TapiService.java create mode 100644 tapisimulator/src/main/java/org/onap/tapisimulator/utils/Utils.java create mode 100644 tapisimulator/src/main/resources/application.properties create mode 100644 tapisimulator/src/main/resources/logback.xml create mode 100644 tapisimulator/src/test/java/org/onap/tapisimulator/Config.java create mode 100644 tapisimulator/src/test/java/org/onap/tapisimulator/TestUtils.java create mode 100644 tapisimulator/src/test/java/org/onap/tapisimulator/controller/TestTapiController.java create mode 100644 tapisimulator/src/test/resources/service-create-tapi.json create mode 100644 tapisimulator/src/test/resources/siplist.json create mode 100644 tapisimulator/src/test/resources/tapi-topology.json diff --git a/.gitignore b/.gitignore index 33defe4..a459221 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ .tox/ +/target/ diff --git a/.project b/.project new file mode 100644 index 0000000..c205478 --- /dev/null +++ b/.project @@ -0,0 +1,17 @@ + + + integration-dc-simulator + + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.m2e.core.maven2Nature + + diff --git a/.settings/org.eclipse.core.resources.prefs b/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000..4824b80 --- /dev/null +++ b/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding/=UTF-8 diff --git a/.settings/org.eclipse.m2e.core.prefs b/.settings/org.eclipse.m2e.core.prefs new file mode 100644 index 0000000..14b697b --- /dev/null +++ b/.settings/org.eclipse.m2e.core.prefs @@ -0,0 +1,4 @@ +activeProfiles= +eclipse.preferences.version=1 +resolveWorkspaceProjects=true +version=1 diff --git a/README.md b/README.md new file mode 100644 index 0000000..a1904c0 --- /dev/null +++ b/README.md @@ -0,0 +1,21 @@ +## DC SIMULATOR + +Project consists of two submodules: +1. msasimulator +2. tapisimulator + +Detailed information about submodules can be found in ```README.md``` in their directories. + +## Project building +``` +mvn clean package +``` +## Building Docker images +``` +mvn clean package -P docker -DskipTests=true + +## To bring up two instances of TAPI and one instance of MSA +The configurations are present in docker-compose.yml. Execute the following +docker-compose up + +## To bring it up in the onap cluster chart configurations are present in charts folder diff --git a/checkstyle-suppressions.xml b/checkstyle-suppressions.xml new file mode 100644 index 0000000..69ee088 --- /dev/null +++ b/checkstyle-suppressions.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..36f3cc2 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,25 @@ +version: '3' + +services: + + msa: + image: nexus3.onap.org:10003/onap/tapisimulator + restart: always + environment: + Controller: MSA + ports: + - "8082:8082" + + tap1: + image: nexus3.onap.org:10003/onap/tapisimulator + restart: always + ports: + - 8081:8080 + environment: + Controller: TAPI1 + + tapi2: + image: nexus3.onap.org:10003/onap/tapisimulator + ports: + - "8083:8080" + restart: on-failure diff --git a/msasimulator/.classpath b/msasimulator/.classpath new file mode 100644 index 0000000..5bd7d18 --- /dev/null +++ b/msasimulator/.classpath @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/msasimulator/.gitignore b/msasimulator/.gitignore new file mode 100644 index 0000000..b83d222 --- /dev/null +++ b/msasimulator/.gitignore @@ -0,0 +1 @@ +/target/ diff --git a/msasimulator/.project b/msasimulator/.project new file mode 100644 index 0000000..6661c2f --- /dev/null +++ b/msasimulator/.project @@ -0,0 +1,23 @@ + + + msasimulator + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.jdt.core.javanature + org.eclipse.m2e.core.maven2Nature + + diff --git a/msasimulator/.settings/org.eclipse.core.resources.prefs b/msasimulator/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000..04cfa2c --- /dev/null +++ b/msasimulator/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,6 @@ +eclipse.preferences.version=1 +encoding//src/main/java=UTF-8 +encoding//src/main/resources=UTF-8 +encoding//src/test/java=UTF-8 +encoding//src/test/resources=UTF-8 +encoding/=UTF-8 diff --git a/msasimulator/.settings/org.eclipse.jdt.core.prefs b/msasimulator/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..d59e09c --- /dev/null +++ b/msasimulator/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,5 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/msasimulator/.settings/org.eclipse.m2e.core.prefs b/msasimulator/.settings/org.eclipse.m2e.core.prefs new file mode 100644 index 0000000..14b697b --- /dev/null +++ b/msasimulator/.settings/org.eclipse.m2e.core.prefs @@ -0,0 +1,4 @@ +activeProfiles= +eclipse.preferences.version=1 +resolveWorkspaceProjects=true +version=1 diff --git a/msasimulator/Dockerfile b/msasimulator/Dockerfile new file mode 100644 index 0000000..6f66773 --- /dev/null +++ b/msasimulator/Dockerfile @@ -0,0 +1,9 @@ +FROM java:openjdk-8 +ARG VERSION=${version} +ARG JAR_FILE=target/msasimulator-${VERSION}.jar +COPY ${JAR_FILE} app.jar +COPY json-files/* /opt/onap/msasimulator/templates/ +ADD entrypoint.sh . +RUN chmod +x entrypoint.sh +EXPOSE 8082 +ENTRYPOINT ["./entrypoint.sh"] diff --git a/msasimulator/README.md b/msasimulator/README.md new file mode 100644 index 0000000..dd5b3aa --- /dev/null +++ b/msasimulator/README.md @@ -0,0 +1,98 @@ +##MSA Controller Simulator Project. + +The simulator is a simple spring boot application which acts as the MSA controller for the MDONS use case + +##The API'S are as follows: + +1.Create Service : /cxf/openroadm/openroadm-services/create +2.Delete Service : /cxf/openroadm/openroadm-services/delete +3.Get Topology : /cxf/openroadm/v2/networks/otn-topology + +## +Sample create request: + +{ + "common-id":"123456", + "connection-type":"service", + "service-name":"svc-Customer1-orange-001_MDONS_OTN_MSA", + "sdnc-request-header":{ + "request-id":"fd532fb8-fb9a-477b-b0a9-f8f33ba79f23", + "rpc-action":"service-create", + "notification-url":"http://167.254.204.118:8090/receiver/services", + "request-system-id":"SDN-MLC" + }, + "service-a-end":{ + "service-rate":10, + "service-format":"Ethernet", + "clli":"OWB-AEND", + "node-id":"OWBSPDRNE15", + "optic-type":"gray", + "ethernet-encoding":"10GBASE-R", + "mapping-mode":"GFP-F", + "tx-direction":{ + "port":{ + "port-device-name":"router-1", + "port-name":"R1" + } + }, + "rx-direction":{ + "port":{ + "port-device-name":"router-1", + "port-name":"R1" + } + } + }, + "service-z-end":{ + "service-rate":10, + "service-format":"Ethernet", + "node-id":"OWBSPDRNE16", + "clli":"OWB-ZEND", + "optic-type":"gray", + "ethernet-encoding":"10GBASE-R", + "mapping-mode":"GFP-F", + "tx-direction":{ + "port":{ + "port-device-name":"router-2", + "port-name":"R2" + } + }, + "rx-direction":{ + "port":{ + "port-device-name":"router-2", + "port-name":"R2" + } + } + }, + "service-layer":"otn" +} + +##Sample delete request + + +{ + "sdnc-request-header":{ + "request-id":"fd532fb8-fb9a-477b-b0a9-f8f33ba79f23", + "rpc-action":"service-create", + "notification-url":"http://167.254.204.118:8090/receiver/services", + "request-system-id":"SDN-MLC" + }, + "service-delete-req-info":{ + "tail-retention": "no", + "service-name": "no" + } +} + +##To bring up locally along with the other instances go to the main directory dc-simluator +Execute docker-compose up + + +##To compile and build +mvn clean install + + +##To build docker image +mvn package -P docker + + + + diff --git a/msasimulator/entrypoint.sh b/msasimulator/entrypoint.sh new file mode 100644 index 0000000..dfa956a --- /dev/null +++ b/msasimulator/entrypoint.sh @@ -0,0 +1,4 @@ +#!/bin/bash + +java -jar app.jar org.onap.msasimulator.Application + diff --git a/msasimulator/json-files/msa-topology.json b/msasimulator/json-files/msa-topology.json new file mode 100644 index 0000000..7519d93 --- /dev/null +++ b/msasimulator/json-files/msa-topology.json @@ -0,0 +1,130 @@ +{ + "network-id": "otn-topology", + "ietf-network-topology:link": [ + { + "link-id": "NodeA-XPDR1#XPDR1-NETWORK1##NodeB-XPDR1#XPDR1-NETWORK2", + "org-openroadm-network-topology:administrative-state": "outOfService", + "org-openroadm-otn-network-topology:link-type": "OTN-LINK", + "destination": { + "dest-node": "NodeB-XPDR1", + "dest-tp": "XPDR1-NETWORK2" + }, + "source": { + "source-node": "NodeA-XPDR1", + "source-tp": "XPDR1-NETWORK1" + } + } + ], + "supporting-network": [ + { + "network-ref": "openroadm-topology" + } + ], + "network-types": {}, + "node": [ + { + "supporting-node": [ + { + "network-ref": "openroadm-topology", + "node-ref": "NodeA-XPDR1" + } + ], + "node-id": "NodeA-XPDR1", + "ietf-network-topology:termination-point": [ + { + "org-openroadm-otn-network-topology:tp-type": "XPONDER-CLIENT", + "org-openroadm-otn-network-topology:eqpt-srg-id": 1, + "tp-id": "XPDR1-CLIENT1", + "supporting-termination-point": [ + { + "network-ref": "openroadm-topology", + "tp-ref": "XPDR1-CLIENT1", + "node-ref": "NodeA-XPDR1" + } + ] + }, + { + "org-openroadm-otn-network-topology:tp-type": "XPONDER-CLIENT", + "org-openroadm-otn-network-topology:eqpt-srg-id": 1, + "tp-id": "XPDR1-CLIENT2", + "supporting-termination-point": [ + { + "network-ref": "openroadm-topology", + "tp-ref": "XPDR1-CLIENT2", + "node-ref": "NodeA-XPDR1" + }, + { + "org-openroadm-otn-network-topology:tp-type": "XPONDER-NETWORK", + "org-openroadm-otn-network-topology:eqpt-srg-id": 1, + "tp-id": "XPDR1-NETWORK1", + "supporting-termination-point": [ + { + "network-ref": "openroadm-topology", + "tp-ref": "XPDR1-NETWORK1", + "node-ref": "NodeA-XPDR1" + } + ] + } + ] + } + ], + "org-openroadm-network:node-status": "PLANNED", + "org-openroadm-otn-network-topology:node-type": "SWITCH", + "org-openroadm-otn-network-topology:xpdr-attributes": { + "xpdr-number": 1 + } + }, + { + "supporting-node": [ + { + "network-ref": "openroadm-topology", + "node-ref": "NodeB-XPDR1" + } + ], + "node-id": "NodeB-XPDR1", + "ietf-network-topology:termination-point": [ + { + "org-openroadm-otn-network-topology:tp-type": "XPONDER-CLIENT", + "org-openroadm-otn-network-topology:eqpt-srg-id": 1, + "tp-id": "XPDR1-CLIENT1", + "supporting-termination-point": [ + { + "network-ref": "openroadm-topology", + "tp-ref": "XPDR1-CLIENT1", + "node-ref": "NodeA-XPDR1" + } + ] + }, + { + "org-openroadm-otn-network-topology:tp-type": "XPONDER-CLIENT", + "org-openroadm-otn-network-topology:eqpt-srg-id": 1, + "tp-id": "XPDR1-CLIENT2", + "supporting-termination-point": [ + { + "network-ref": "openroadm-topology", + "tp-ref": "XPDR1-CLIENT2", + "node-ref": "NodeA-XPDR1" + }, + { + "org-openroadm-otn-network-topology:tp-type": "XPONDER-NETWORK", + "org-openroadm-otn-network-topology:eqpt-srg-id": 1, + "tp-id": "XPDR1-NETWORK1", + "supporting-termination-point": [ + { + "network-ref": "openroadm-topology", + "tp-ref": "XPDR1-NETWORK1", + "node-ref": "NodeA-XPDR1" + } + ] + } + ] + } + ], + "org-openroadm-network:node-status": "PLANNED", + "org-openroadm-otn-network-topology:node-type": "SWITCH", + "org-openroadm-otn-network-topology:xpdr-attributes": { + "xpdr-number": 1 + } + } + ] +} diff --git a/msasimulator/pom.xml b/msasimulator/pom.xml new file mode 100644 index 0000000..803977a --- /dev/null +++ b/msasimulator/pom.xml @@ -0,0 +1,306 @@ + + + + + + 4.0.0 + + + org.onap.integration.simulators.dc-simulator + integration-dc-simulator + 1.0.0-SNAPSHOT + + + + + msasimulator + 1.0.0-SNAPSHOT + + msasimulator + + + UTF-8 + 1.8 + 1.8 + yyyyMMdd'T'HHmmss + + org.onap.msasimulator.Application + latest + 5.1.0 + 5.1.0 + 2.1.5.RELEASE + onap/${project.artifactId} + + libs + ${project.build.directory}/${dependency.directory.name} + + + nexus3.onap.org:10003 + http://nexus3.onap.org + + + + + org.springframework.boot + spring-boot-starter-web + ${spring.boot.version} + + + org.springframework.boot + spring-boot-starter-data-mongodb + ${spring.boot.version} + + + org.springframework.boot + spring-boot-starter-actuator + ${spring.boot.version} + + + org.springframework.cloud + spring-cloud-config-client + 2.1.4.RELEASE + + + ch.qos.logback + logback-classic + + + ch.qos.logback + logback-core + 1.2.3 + + + org.slf4j + slf4j-api + 1.7.25 + + + commons-io + commons-io + 2.6 + + + org.json + json + 20180130 + + + com.google.code.gson + gson + 2.8.2 + + + org.apache.httpcomponents + httpclient + + + com.google.guava + guava + + + commons-cli + commons-cli + 1.4 + + + org.apache.commons + commons-lang3 + 3.7 + + + org.projectlombok + lombok + 1.18.2 + provided + + + com.fasterxml.jackson.datatype + jackson-datatype-jdk8 + 2.9.7 + + + com.fasterxml.jackson.datatype + jackson-datatype-jsr310 + 2.9.7 + + + io.vavr + vavr-match + 0.9.2 + + + io.vavr + vavr + 0.9.2 + + + + + + org.assertj + assertj-core + 3.9.1 + test + + + org.mockito + mockito-core + 2.23.4 + test + + + junit + junit + 4.12 + test + + + + + org.springframework.boot + spring-boot-starter-test + ${spring.boot.version} + test + + + org.quartz-scheduler + quartz + 2.2.1 + + + org.quartz-scheduler + quartz-jobs + 2.2.1 + + + + + + org.springframework.boot + spring-boot-maven-plugin + 2.1.5.RELEASE + + org.onap.msasimulator.Application + + + + + repackage + + + + + + + org.apache.maven.plugins + maven-jar-plugin + 3.1.0 + + + + org.onap.msasimulator.Application + + + + + + + + + + + + docker + + false + + + linux + x86_64 + ${os.detected.name}-${os.detected.arch} + + + + + io.fabric8 + docker-maven-plugin + ${docker-maven-plugin.version} + + + docker-build-image + package + + build + + + + docker-push-image + deploy + + push + + + + + ${skipDockerPush} + true + IfNotPresent + + + ${project.artifactId} + ${onap.nexus.dockerregistry.daily}/${docker.image.name} + ${onap.nexus.dockerregistry.daily} + + ${project.basedir} + + ${project.version}-STAGE-${maven.build.timestamp}Z + + + + + + + + + + + + + + + ecomp-releases + Integration simulators Release Repository + ${nexusproxy}${releaseNexusPath} + + + ecomp-snapshots + Integration simulators Snapshot Repository + ${nexusproxy}${snapshotNexusPath} + + + ecomp-site + dav:${nexusproxy}${sitePath} + + + + diff --git a/msasimulator/src/main/java/org/onap/msasimulator/Application.java b/msasimulator/src/main/java/org/onap/msasimulator/Application.java new file mode 100644 index 0000000..01a593d --- /dev/null +++ b/msasimulator/src/main/java/org/onap/msasimulator/Application.java @@ -0,0 +1,36 @@ +/* + * ============LICENSE_START======================================================= + * MSA-SIMULATOR + * ================================================================================ + * Copyright (C) 2020 Fujitsu Limited. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.onap.msasimulator; + +import java.util.Arrays; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.ApplicationContext; + +@SpringBootApplication +public class Application { + + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } + +} diff --git a/msasimulator/src/main/java/org/onap/msasimulator/controller/MsaController.java b/msasimulator/src/main/java/org/onap/msasimulator/controller/MsaController.java new file mode 100644 index 0000000..dab79a9 --- /dev/null +++ b/msasimulator/src/main/java/org/onap/msasimulator/controller/MsaController.java @@ -0,0 +1,71 @@ +/* + * ============LICENSE_START======================================================= + * MSA-SIMULATOR + * ================================================================================ + * Copyright (C) 2020 Fujitsu Limited. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.onap.msasimulator.controller; + +import javax.validation.Valid; + +import org.onap.msasimulator.model.MsaServiceCreateRequest; +import org.onap.msasimulator.model.MsaServiceDeleteRequest; +import org.onap.msasimulator.model.MsaServiceResponse; +import org.onap.msasimulator.service.MsaService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class MsaController { + + @Autowired + MsaService msaService; + + @RequestMapping("/") + public String index() { + return "Test successful"; + } + + @PostMapping("/cxf/openroadm/openroadm-services/create") + public ResponseEntity createService(@Valid @RequestBody MsaServiceCreateRequest request) { + + MsaServiceResponse response = msaService.processMsaService(request); + return new ResponseEntity<>(response, HttpStatus.OK); + + } + + @DeleteMapping("/cxf/openroadm/openroadm-services/delete") + public ResponseEntity deleteService(@Valid @RequestBody MsaServiceDeleteRequest request) { + MsaServiceResponse response = msaService.processMsaServiceDelete(request); + return new ResponseEntity<>(response, HttpStatus.OK); + + } + + @GetMapping("/cxf/openroadm/v2/networks/otn-topology") + public String getMsaTopology() { + + return msaService.getTopology(); + + } +} diff --git a/msasimulator/src/main/java/org/onap/msasimulator/model/ConfigurationResponseCommon.java b/msasimulator/src/main/java/org/onap/msasimulator/model/ConfigurationResponseCommon.java new file mode 100644 index 0000000..377a51f --- /dev/null +++ b/msasimulator/src/main/java/org/onap/msasimulator/model/ConfigurationResponseCommon.java @@ -0,0 +1,51 @@ +/* + * ============LICENSE_START======================================================= + * MSA-SIMULATOR + * ================================================================================ + * Copyright (C) 2020 Fujitsu Limited. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.onap.msasimulator.model; + +import javax.validation.constraints.NotNull; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class ConfigurationResponseCommon { + @NotNull + @JsonProperty(value = "response-code") + private String responseCode; + + @NotNull + @JsonProperty(value = "ack-final-indicator") + private String ackFinalIndicator; + + @NotNull + @JsonProperty(value = "response-message") + private String responseMessage; + + @NotNull + @JsonProperty(value = "request-id") + private String requestId; + +} diff --git a/msasimulator/src/main/java/org/onap/msasimulator/model/DirectionDetails.java b/msasimulator/src/main/java/org/onap/msasimulator/model/DirectionDetails.java new file mode 100644 index 0000000..847a344 --- /dev/null +++ b/msasimulator/src/main/java/org/onap/msasimulator/model/DirectionDetails.java @@ -0,0 +1,38 @@ +/* + * ============LICENSE_START======================================================= + * MSA-SIMULATOR + * ================================================================================ + * Copyright (C) 2020 Fujitsu Limited. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ +package org.onap.msasimulator.model; + +import javax.validation.constraints.NotNull; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class DirectionDetails { + @NotNull + @JsonProperty(value = "port") + private Port port; + +} diff --git a/msasimulator/src/main/java/org/onap/msasimulator/model/Link.java b/msasimulator/src/main/java/org/onap/msasimulator/model/Link.java new file mode 100644 index 0000000..9644228 --- /dev/null +++ b/msasimulator/src/main/java/org/onap/msasimulator/model/Link.java @@ -0,0 +1,36 @@ +/* + * ============LICENSE_START======================================================= + * MSA-SIMULATOR + * ================================================================================ + * Copyright (C) 2020 Fujitsu Limited. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.onap.msasimulator.model; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class Link { + + private String aend; + + private String zend; + +} diff --git a/msasimulator/src/main/java/org/onap/msasimulator/model/MsaServiceCreateRequest.java b/msasimulator/src/main/java/org/onap/msasimulator/model/MsaServiceCreateRequest.java new file mode 100644 index 0000000..63bd552 --- /dev/null +++ b/msasimulator/src/main/java/org/onap/msasimulator/model/MsaServiceCreateRequest.java @@ -0,0 +1,64 @@ +/* + * ============LICENSE_START======================================================= + * MSA-SIMULATOR + * ================================================================================ + * Copyright (C) 2020 Fujitsu Limited. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.onap.msasimulator.model; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import javax.validation.constraints.NotNull; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class MsaServiceCreateRequest { + + @NotNull + @JsonProperty(value = "service-layer") + private String serviceLayer; + + @NotNull + @JsonProperty(value = "service-name") + private String serviceName; + + @NotNull + @JsonProperty(value = "service-a-end") + private ServiceEndPoint serviceAEend; + + @NotNull + @JsonProperty(value = "common-id") + private String commonId; + + @NotNull + @JsonProperty(value = "sdnc-request-header") + private SdncRequestHeader sdncRequestHeader; + + @NotNull + @JsonProperty(value = "service-z-end") + private ServiceEndPoint serviceZEnd; + + @NotNull + @JsonProperty(value = "connection-type") + private String connectionType; + +} diff --git a/msasimulator/src/main/java/org/onap/msasimulator/model/MsaServiceDeleteRequest.java b/msasimulator/src/main/java/org/onap/msasimulator/model/MsaServiceDeleteRequest.java new file mode 100644 index 0000000..e295c81 --- /dev/null +++ b/msasimulator/src/main/java/org/onap/msasimulator/model/MsaServiceDeleteRequest.java @@ -0,0 +1,44 @@ +/* + * ============LICENSE_START======================================================= + * MSA-SIMULATOR + * ================================================================================ + * Copyright (C) 2020 Fujitsu Limited. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.onap.msasimulator.model; + +import javax.validation.constraints.NotNull; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class MsaServiceDeleteRequest { + + @NotNull + @JsonProperty(value = "sdnc-request-header") + private SdncRequestHeader sdncRequestHeader; + + @NotNull + @JsonProperty(value = "service-delete-req-info") + private ServiceDeleteInfo serviceDeletReqInfo; + +} diff --git a/msasimulator/src/main/java/org/onap/msasimulator/model/MsaServiceResponse.java b/msasimulator/src/main/java/org/onap/msasimulator/model/MsaServiceResponse.java new file mode 100644 index 0000000..83549fc --- /dev/null +++ b/msasimulator/src/main/java/org/onap/msasimulator/model/MsaServiceResponse.java @@ -0,0 +1,40 @@ +/* + * ============LICENSE_START======================================================= + * MSA-SIMULATOR + * ================================================================================ + * Copyright (C) 2020 Fujitsu Limited. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.onap.msasimulator.model; + +import javax.validation.constraints.NotNull; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class MsaServiceResponse { + + @NotNull + @JsonProperty(value = "configuration-response-common") + private ConfigurationResponseCommon configurationResponseCommon; + +} diff --git a/msasimulator/src/main/java/org/onap/msasimulator/model/Port.java b/msasimulator/src/main/java/org/onap/msasimulator/model/Port.java new file mode 100644 index 0000000..041835b --- /dev/null +++ b/msasimulator/src/main/java/org/onap/msasimulator/model/Port.java @@ -0,0 +1,44 @@ +/* + * ============LICENSE_START======================================================= + * MSA-SIMULATOR + * ================================================================================ + * Copyright (C) 2020 Fujitsu Limited. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.onap.msasimulator.model; + +import javax.validation.constraints.NotNull; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class Port { + + @NotNull + @JsonProperty(value = "port-device-name") + private String portDeviceName; + + @NotNull + @JsonProperty(value = "port-name") + private String portName; + +} diff --git a/msasimulator/src/main/java/org/onap/msasimulator/model/SdncRequestHeader.java b/msasimulator/src/main/java/org/onap/msasimulator/model/SdncRequestHeader.java new file mode 100644 index 0000000..bddfded --- /dev/null +++ b/msasimulator/src/main/java/org/onap/msasimulator/model/SdncRequestHeader.java @@ -0,0 +1,51 @@ +/* + * ============LICENSE_START======================================================= + * MSA-SIMULATOR + * ================================================================================ + * Copyright (C) 2020 Fujitsu Limited. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.onap.msasimulator.model; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import javax.validation.constraints.NotNull; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class SdncRequestHeader { + @NotNull + @JsonProperty(value = "notification-url") + private String notificationUrl; + + @NotNull + @JsonProperty(value = "request-system-id") + private String requestSystemId; + + @NotNull + @JsonProperty(value = "request-id") + private String requestId; + + @NotNull + @JsonProperty(value = "rpc-action") + private String rpcAction; + +} diff --git a/msasimulator/src/main/java/org/onap/msasimulator/model/ServiceDeleteInfo.java b/msasimulator/src/main/java/org/onap/msasimulator/model/ServiceDeleteInfo.java new file mode 100644 index 0000000..7da5af2 --- /dev/null +++ b/msasimulator/src/main/java/org/onap/msasimulator/model/ServiceDeleteInfo.java @@ -0,0 +1,44 @@ +/* + * ============LICENSE_START======================================================= + * MSA-SIMULATOR + * ================================================================================ + * Copyright (C) 2020 Fujitsu Limited. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.onap.msasimulator.model; + +import javax.validation.constraints.NotNull; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class ServiceDeleteInfo { + + @NotNull + @JsonProperty(value = "service-name") + private String serviceName; + + @NotNull + @JsonProperty(value = "tail-retention") + private String tailRetention; + +} diff --git a/msasimulator/src/main/java/org/onap/msasimulator/model/ServiceEndPoint.java b/msasimulator/src/main/java/org/onap/msasimulator/model/ServiceEndPoint.java new file mode 100644 index 0000000..ab05f99 --- /dev/null +++ b/msasimulator/src/main/java/org/onap/msasimulator/model/ServiceEndPoint.java @@ -0,0 +1,71 @@ +/* + * ============LICENSE_START======================================================= + * MSA-SIMULATOR + * ================================================================================ + * Copyright (C) 2020 Fujitsu Limited. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.onap.msasimulator.model; + +import javax.validation.constraints.NotNull; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class ServiceEndPoint { + @NotNull + @JsonProperty(value = "rx-direction") + private DirectionDetails rxDirection; + + @NotNull + @JsonProperty(value = "service-format") + private String serviceFormat; + + @NotNull + @JsonProperty(value = "node-id") + private String nodeId; + + @NotNull + @JsonProperty(value = "mapping-mode") + private String mappingMode; + + @NotNull + @JsonProperty(value = "optic-type") + private String opticType; + + @NotNull + @JsonProperty(value = "clli") + private String clli; + + @NotNull + @JsonProperty(value = "service-rate") + private String serviceRate; + + @NotNull + @JsonProperty(value = "tx-direction") + private DirectionDetails txDirection; + + @NotNull + @JsonProperty(value = "ethernet-encoding") + private String ethernetEncoding; + +} diff --git a/msasimulator/src/main/java/org/onap/msasimulator/service/MsaService.java b/msasimulator/src/main/java/org/onap/msasimulator/service/MsaService.java new file mode 100644 index 0000000..2091d61 --- /dev/null +++ b/msasimulator/src/main/java/org/onap/msasimulator/service/MsaService.java @@ -0,0 +1,117 @@ +/* + * ============LICENSE_START======================================================= + * MSA-SIMULATOR + * ================================================================================ + * Copyright (C) 2020 Fujitsu Limited. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.onap.msasimulator.service; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import javax.annotation.PostConstruct; + +import org.json.JSONArray; +import org.json.JSONObject; +import org.onap.msasimulator.model.ConfigurationResponseCommon; +import org.onap.msasimulator.model.Link; +import org.onap.msasimulator.model.MsaServiceCreateRequest; +import org.onap.msasimulator.model.MsaServiceDeleteRequest; +import org.onap.msasimulator.model.MsaServiceResponse; +import org.onap.msasimulator.utils.Utils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import lombok.Getter; + +@Service +public class MsaService { + + private static Logger log = LoggerFactory.getLogger(MsaService.class); + + @Getter + private String topology = ""; + + private List linkList = new ArrayList<>(); + + private List serviceIdList = new ArrayList<>(); + + @Autowired + Utils utils; + + @PostConstruct + public void init() throws IOException { + topology = utils.readFromFile("/opt/onap/msasimulator/templates/msa-topology.json"); + log.debug("Inside init method of MsaService classc {}", topology); + JSONObject topo = new JSONObject(topology); + JSONArray topolinks = topo.getJSONArray("ietf-network-topology:link"); + for (Object topolink : topolinks) { + if (topolink instanceof JSONObject) { + JSONObject obj = (JSONObject) topolink; + Link link = new Link(obj.getJSONObject("source").getString("source-node").split("-")[0], + obj.getJSONObject("destination").getString("dest-node").split("-")[0]); + linkList.add(link); + + } + + } + log.debug("Link list {}", linkList); + + } + + public MsaServiceResponse processMsaService(MsaServiceCreateRequest request) { + String aend = request.getServiceAEend().getNodeId(); + String zend = request.getServiceZEnd().getNodeId(); + String requestId = request.getSdncRequestHeader().getRequestId(); + Link link = new Link(aend, zend); + if (linkList.contains(link)) { + serviceIdList.add(requestId); + return formServiceResponse(requestId, "200", "Service creation was successful"); + } else { + return formServiceResponse(requestId, "410", "Link not available , Service creation failed"); + + } + + } + + private MsaServiceResponse formServiceResponse(String requestId, String responseCode, String responseMessage) { + MsaServiceResponse response = new MsaServiceResponse(); + ConfigurationResponseCommon configuration = new ConfigurationResponseCommon(); + configuration.setRequestId(requestId); + configuration.setResponseCode(responseCode); + configuration.setResponseMessage(responseMessage); + configuration.setAckFinalIndicator("Y"); + response.setConfigurationResponseCommon(configuration); + return response; + + } + + public MsaServiceResponse processMsaServiceDelete(MsaServiceDeleteRequest request) { + String requestId = request.getSdncRequestHeader().getRequestId(); + if (serviceIdList.contains(requestId)) { + serviceIdList.remove(requestId); + return formServiceResponse(requestId, "200", "Service deletion success"); + } else { + return formServiceResponse(requestId, "410", "Service does not exist"); + } + + } + +} diff --git a/msasimulator/src/main/java/org/onap/msasimulator/utils/Utils.java b/msasimulator/src/main/java/org/onap/msasimulator/utils/Utils.java new file mode 100644 index 0000000..2f0d924 --- /dev/null +++ b/msasimulator/src/main/java/org/onap/msasimulator/utils/Utils.java @@ -0,0 +1,63 @@ +/* + * ============LICENSE_START======================================================= + * MSA-SIMULATOR + * ================================================================================ + * Copyright (C) 2020 Fujitsu Limited. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.onap.msasimulator.utils; + +import java.io.File; +import java.io.FileReader; +import java.io.BufferedReader; +import java.io.IOException; +import java.nio.file.Files; +import org.springframework.stereotype.Component; +import org.springframework.util.ResourceUtils; + +@Component +public class Utils { + + public void readFileclasspath() throws IOException { + File file = ResourceUtils.getFile("classpath:config/sample.txt"); + + // File is found + System.out.println("File Found : " + file.exists()); + + // Read File Content + String content = new String(Files.readAllBytes(file.toPath())); + System.out.println(content); + } + + public String readFromFile(String file) { + String content = ""; + try { + + BufferedReader bufferedReader = new BufferedReader(new FileReader(file)); + content = bufferedReader.readLine(); + String temp; + while ((temp = bufferedReader.readLine()) != null) { + content = content.concat(temp); + } + content = content.trim(); + bufferedReader.close(); + } catch (Exception e) { + content = null; + } + return content; + } + +} diff --git a/msasimulator/src/main/resources/application.properties b/msasimulator/src/main/resources/application.properties new file mode 100644 index 0000000..3cf12af --- /dev/null +++ b/msasimulator/src/main/resources/application.properties @@ -0,0 +1 @@ +server.port=8082 diff --git a/msasimulator/src/main/resources/logback.xml b/msasimulator/src/main/resources/logback.xml new file mode 100644 index 0000000..726b326 --- /dev/null +++ b/msasimulator/src/main/resources/logback.xml @@ -0,0 +1,28 @@ + + + + logFileName + msasim + + + + + /var/log/onap/msasimulator/${logFileName}.log + + ${logFileName}.%i.log.zip + 1 + 5 + + + 5MB + + + %d{dd-MM-yyyy HH:mm:ss.SSS} %magenta([%thread]) %highlight(%-5level) %logger{36}.%M - %msg%n + + + + + + + + diff --git a/msasimulator/src/test/java/org/onap/msasimulator/Config.java b/msasimulator/src/test/java/org/onap/msasimulator/Config.java new file mode 100644 index 0000000..f39016a --- /dev/null +++ b/msasimulator/src/test/java/org/onap/msasimulator/Config.java @@ -0,0 +1,62 @@ +/* + * ============LICENSE_START======================================================= + * MSA-SIMULATOR + * ================================================================================ + * Copyright (C) 2020 Fujitsu Limited. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.onap.msasimulator; + +import org.onap.msasimulator.utils.Utils; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.io.ClassPathResource; +import org.springframework.core.io.Resource; +import org.springframework.util.FileCopyUtils; +import org.springframework.context.annotation.Bean; +import org.mockito.Mockito; +import static org.mockito.Mockito.when; + +import java.io.IOException; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; + +@Configuration +public class Config { + + @Bean + public Utils utils() { + Utils utils = Mockito.mock(Utils.class); + String topology = readFileclasspath("topology.json"); + when(utils.readFromFile("/opt/onap/msasimulator/templates/msa-topology.json")).thenReturn(topology); + + return utils; + } + + public static String readFileclasspath(String filename) { + String data = ""; + Resource resource = new ClassPathResource(filename); + InputStream inputStream; + try { + inputStream = resource.getInputStream(); + byte[] bdata = FileCopyUtils.copyToByteArray(inputStream); + data = new String(bdata, StandardCharsets.UTF_8); + return data; + } catch (IOException e) { + return data; + } + } + +} diff --git a/msasimulator/src/test/java/org/onap/msasimulator/TestUtils.java b/msasimulator/src/test/java/org/onap/msasimulator/TestUtils.java new file mode 100644 index 0000000..6b9c546 --- /dev/null +++ b/msasimulator/src/test/java/org/onap/msasimulator/TestUtils.java @@ -0,0 +1,47 @@ +/* + * ============LICENSE_START======================================================= + * MSA-SIMULATOR + * ================================================================================ + * Copyright (C) 2020 Fujitsu Limited. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.onap.msasimulator; + +import java.io.IOException; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; + +import org.springframework.core.io.ClassPathResource; +import org.springframework.core.io.Resource; +import org.springframework.util.FileCopyUtils; + +public class TestUtils { + + public static String readFileclasspath(String filename) { + String data = ""; + Resource resource = new ClassPathResource(filename); + InputStream inputStream; + try { + inputStream = resource.getInputStream(); + byte[] bdata = FileCopyUtils.copyToByteArray(inputStream); + data = new String(bdata, StandardCharsets.UTF_8); + return data; + } catch (IOException e) { + return data; + } + } + +} diff --git a/msasimulator/src/test/java/org/onap/msasimulator/controller/TestMsaController.java b/msasimulator/src/test/java/org/onap/msasimulator/controller/TestMsaController.java new file mode 100644 index 0000000..5515556 --- /dev/null +++ b/msasimulator/src/test/java/org/onap/msasimulator/controller/TestMsaController.java @@ -0,0 +1,110 @@ +/* + * ============LICENSE_START======================================================= + * MSA-SIMULATOR + * ================================================================================ + * Copyright (C) 2020 Fujitsu Limited. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.onap.msasimulator.controller; + +import static org.junit.Assert.assertEquals; +import static org.mockito.Mockito.when; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; + +import com.fasterxml.jackson.databind.ObjectMapper; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.onap.msasimulator.Application; +import org.onap.msasimulator.Config; +import org.onap.msasimulator.TestUtils; +import org.onap.msasimulator.model.MsaServiceCreateRequest; +import org.onap.msasimulator.model.MsaServiceResponse; +import org.onap.msasimulator.service.MsaService; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.http.MediaType; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.MvcResult; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; + +@RunWith(SpringRunner.class) +@SpringBootTest( + properties = "spring.main.allow-bean-definition-overriding=true", + classes = {Application.class, Config.class}, + webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) +public class TestMsaController { + + @InjectMocks + MsaController msaController; + + @Mock + MsaService msaService; + + private MockMvc mvc; + + private ObjectMapper mapper; + + @Before + public void beforeEach() { + + MockitoAnnotations.initMocks(this); + + mvc = MockMvcBuilders.standaloneSetup(msaController).build(); + mapper = new ObjectMapper(); + + } + + @Test + public void testTopology() throws Exception { + String topology = TestUtils.readFileclasspath("topology.json"); + String uri = "/cxf/openroadm/v2/networks/otn-topology"; + when(msaService.getTopology()).thenReturn(topology); + MvcResult mvcResult = mvc.perform(get(uri).accept(MediaType.APPLICATION_JSON_VALUE)).andReturn(); + + int status = mvcResult.getResponse().getStatus(); + assertEquals(200, status); + String content = mvcResult.getResponse().getContentAsString(); + assertEquals(content, topology); + } + + @Test + public void testServiceCreateEndpoint() throws Exception { + String serviceCreaterequest = TestUtils.readFileclasspath("service-create-success.json"); + MsaServiceCreateRequest request = mapper.readValue(serviceCreaterequest, MsaServiceCreateRequest.class); + String response = "{\n" + " \"configuration-response-common\":{\n" + " \"request-id\":\"123456\",\n" + + " \"response-code\":\"200\",\n" + + " \"response-message\":\"Service creation was successful\",\n" + + " \"ack-final-indicator\":\"Y\"\n" + " }\n" + "}"; + MsaServiceResponse expectedResponse = mapper.readValue(response, MsaServiceResponse.class); + String uri = "/cxf/openroadm/openroadm-services/create"; + when(msaService.processMsaService(request)).thenReturn(expectedResponse); + MvcResult mvcResult = mvc.perform(post(uri).content(serviceCreaterequest) + .contentType(MediaType.APPLICATION_JSON_VALUE).accept(MediaType.APPLICATION_JSON_VALUE)).andReturn(); + + int status = mvcResult.getResponse().getStatus(); + assertEquals(200, status); + String content = mvcResult.getResponse().getContentAsString(); + MsaServiceResponse actualResponse = mapper.readValue(content, MsaServiceResponse.class); + assertEquals(actualResponse, expectedResponse); + } + +} diff --git a/msasimulator/src/test/java/org/onap/msasimulator/service/MsaServiceTest.java b/msasimulator/src/test/java/org/onap/msasimulator/service/MsaServiceTest.java new file mode 100644 index 0000000..bc9a5ba --- /dev/null +++ b/msasimulator/src/test/java/org/onap/msasimulator/service/MsaServiceTest.java @@ -0,0 +1,113 @@ +/* + * ============LICENSE_START======================================================= + * MSA-SIMULATOR + * ================================================================================ + * Copyright (C) 2020 Fujitsu Limited. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.onap.msasimulator.service; + +import static org.junit.Assert.assertEquals; + +import com.fasterxml.jackson.core.JsonParseException; +import com.fasterxml.jackson.databind.JsonMappingException; +import com.fasterxml.jackson.databind.ObjectMapper; + +import java.io.IOException; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.MockitoAnnotations; +import org.onap.msasimulator.Application; +import org.onap.msasimulator.Config; +import org.onap.msasimulator.TestUtils; +import org.onap.msasimulator.model.MsaServiceCreateRequest; +import org.onap.msasimulator.model.MsaServiceDeleteRequest; +import org.onap.msasimulator.model.MsaServiceResponse; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@SpringBootTest( + properties = "spring.main.allow-bean-definition-overriding=true", + classes = {Application.class, Config.class}, + webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) + +public class MsaServiceTest { + + @Autowired + MsaService msaService; + + @Autowired + ObjectMapper objectMapper; + + @Before + public void setUp() { + + MockitoAnnotations.initMocks(this); + + } + + @Test + public void testGetTopology() { + String topology = TestUtils.readFileclasspath("topology.json"); + assertEquals(topology, msaService.getTopology()); + } + + @Test + public void testServiceCreateFail() throws JsonParseException, JsonMappingException, IOException { + String requestJson = TestUtils.readFileclasspath("service-create-failure.json"); + MsaServiceCreateRequest request = objectMapper.readValue(requestJson, MsaServiceCreateRequest.class); + String response = "{\n" + " \"configuration-response-common\":{\n" + " \"request-id\":\"123456\",\n" + + " \"response-code\":\"410\",\n" + + " \"response-message\":\"Link not available , Service creation failed\",\n" + + " \"ack-final-indicator\":\"Y\"\n" + " }\n" + "}"; + MsaServiceResponse expectedResponse = objectMapper.readValue(response, MsaServiceResponse.class); + + MsaServiceResponse actualResponse = msaService.processMsaService(request); + assertEquals(expectedResponse, actualResponse); + } + + @Test + public void testServiceCreatSuccessl() throws JsonParseException, JsonMappingException, IOException { + String requestJson = TestUtils.readFileclasspath("service-create-success.json"); + MsaServiceCreateRequest request = objectMapper.readValue(requestJson, MsaServiceCreateRequest.class); + String response = "{\n" + " \"configuration-response-common\":{\n" + " \"request-id\":\"123456\",\n" + + " \"response-code\":\"200\",\n" + + " \"response-message\":\"Service creation was successful\",\n" + + " \"ack-final-indicator\":\"Y\"\n" + " }\n" + "}"; + MsaServiceResponse expectedResponse = objectMapper.readValue(response, MsaServiceResponse.class); + + MsaServiceResponse actualResponse = msaService.processMsaService(request); + assertEquals(expectedResponse, actualResponse); + } + + @Test + public void testServiceDelete() throws JsonParseException, JsonMappingException, IOException { + String requestJson = TestUtils.readFileclasspath("service-delete-request.json"); + MsaServiceDeleteRequest request = objectMapper.readValue(requestJson, MsaServiceDeleteRequest.class); + String response = "{\n" + " \"configuration-response-common\":{\n" + " \"request-id\":\"123456\",\n" + + " \"response-code\":\"200\",\n" + " \"response-message\":\"Service deletion success\",\n" + + " \"ack-final-indicator\":\"Y\"\n" + " }\n" + "}"; + MsaServiceResponse expectedResponse = objectMapper.readValue(response, MsaServiceResponse.class); + + MsaServiceResponse actualResponse = msaService.processMsaServiceDelete(request); + assertEquals(expectedResponse, actualResponse); + } + +} diff --git a/msasimulator/src/test/resources/service-create-failure.json b/msasimulator/src/test/resources/service-create-failure.json new file mode 100644 index 0000000..c008a6f --- /dev/null +++ b/msasimulator/src/test/resources/service-create-failure.json @@ -0,0 +1,54 @@ +{ + "common-id": "1234567", + "connection-type": "service", + "service-name": "svc-Customer1-orange-001_MDONS_OTN_MSA", + "sdnc-request-header": { + "request-id": "123456", + "rpc-action": "service-create", + "notification-url": "http://167.254.204.118:8090/receiver/services", + "request-system-id": "SDN-MLC" + }, + "service-a-end": { + "service-rate": 10, + "service-format": "Ethernet", + "clli": "OWB-AEND", + "node-id": "OWBSPDRNE15", + "optic-type": "gray", + "ethernet-encoding": "10GBASE-R", + "mapping-mode": "GFP-F", + "tx-direction": { + "port": { + "port-device-name": "router-1", + "port-name": "R1" + } + }, + "rx-direction": { + "port": { + "port-device-name": "router-1", + "port-name": "R1" + } + } + }, + "service-z-end": { + "service-rate": 10, + "service-format": "Ethernet", + "node-id": "OWBSPDRNE16", + "clli": "OWB-ZEND", + "optic-type": "gray", + "ethernet-encoding": "10GBASE-R", + "mapping-mode": "GFP-F", + "tx-direction": { + "port": { + "port-device-name": "router-2", + "port-name": "R2" + } + }, + "rx-direction": { + "port": { + "port-device-name": "router-2", + "port-name": "R2" + } + } + }, + "service-layer": "otn" +} diff --git a/msasimulator/src/test/resources/service-create-success.json b/msasimulator/src/test/resources/service-create-success.json new file mode 100644 index 0000000..2edae54 --- /dev/null +++ b/msasimulator/src/test/resources/service-create-success.json @@ -0,0 +1,54 @@ +{ + "common-id": "1234567", + "connection-type": "service", + "service-name": "customer", + "sdnc-request-header": { + "request-id": "123456", + "rpc-action": "service-create", + "notification-url": "http://167.254.204.118:8090/receiver/services", + "request-system-id": "SDN-MLC" + }, + "service-a-end": { + "service-rate": 10, + "service-format": "Ethernet", + "clli": "OWB-AEND", + "node-id": "NodeA", + "optic-type": "gray", + "ethernet-encoding": "10GBASE-R", + "mapping-mode": "GFP-F", + "tx-direction": { + "port": { + "port-device-name": "router-1", + "port-name": "R1" + } + }, + "rx-direction": { + "port": { + "port-device-name": "router-1", + "port-name": "R1" + } + } + }, + "service-z-end": { + "service-rate": 10, + "service-format": "Ethernet", + "node-id": "NodeB", + "clli": "OWB-ZEND", + "optic-type": "gray", + "ethernet-encoding": "10GBASE-R", + "mapping-mode": "GFP-F", + "tx-direction": { + "port": { + "port-device-name": "router-2", + "port-name": "R2" + } + }, + "rx-direction": { + "port": { + "port-device-name": "router-2", + "port-name": "R2" + } + } + }, + "service-layer": "otn" +} diff --git a/msasimulator/src/test/resources/service-delete-request.json b/msasimulator/src/test/resources/service-delete-request.json new file mode 100644 index 0000000..06ed4e9 --- /dev/null +++ b/msasimulator/src/test/resources/service-delete-request.json @@ -0,0 +1,12 @@ +{ + "sdnc-request-header": { + "request-id": "123456", + "rpc-action": "service-delete", + "notification-url": "http://167.254.204.118:8090/receiver/services", + "request-system-id": "SDN-MLC" + }, + "service-delete-req-info": { + "tail-retention": "no", + "service-name": "new" + } +} diff --git a/msasimulator/src/test/resources/topology.json b/msasimulator/src/test/resources/topology.json new file mode 100644 index 0000000..7519d93 --- /dev/null +++ b/msasimulator/src/test/resources/topology.json @@ -0,0 +1,130 @@ +{ + "network-id": "otn-topology", + "ietf-network-topology:link": [ + { + "link-id": "NodeA-XPDR1#XPDR1-NETWORK1##NodeB-XPDR1#XPDR1-NETWORK2", + "org-openroadm-network-topology:administrative-state": "outOfService", + "org-openroadm-otn-network-topology:link-type": "OTN-LINK", + "destination": { + "dest-node": "NodeB-XPDR1", + "dest-tp": "XPDR1-NETWORK2" + }, + "source": { + "source-node": "NodeA-XPDR1", + "source-tp": "XPDR1-NETWORK1" + } + } + ], + "supporting-network": [ + { + "network-ref": "openroadm-topology" + } + ], + "network-types": {}, + "node": [ + { + "supporting-node": [ + { + "network-ref": "openroadm-topology", + "node-ref": "NodeA-XPDR1" + } + ], + "node-id": "NodeA-XPDR1", + "ietf-network-topology:termination-point": [ + { + "org-openroadm-otn-network-topology:tp-type": "XPONDER-CLIENT", + "org-openroadm-otn-network-topology:eqpt-srg-id": 1, + "tp-id": "XPDR1-CLIENT1", + "supporting-termination-point": [ + { + "network-ref": "openroadm-topology", + "tp-ref": "XPDR1-CLIENT1", + "node-ref": "NodeA-XPDR1" + } + ] + }, + { + "org-openroadm-otn-network-topology:tp-type": "XPONDER-CLIENT", + "org-openroadm-otn-network-topology:eqpt-srg-id": 1, + "tp-id": "XPDR1-CLIENT2", + "supporting-termination-point": [ + { + "network-ref": "openroadm-topology", + "tp-ref": "XPDR1-CLIENT2", + "node-ref": "NodeA-XPDR1" + }, + { + "org-openroadm-otn-network-topology:tp-type": "XPONDER-NETWORK", + "org-openroadm-otn-network-topology:eqpt-srg-id": 1, + "tp-id": "XPDR1-NETWORK1", + "supporting-termination-point": [ + { + "network-ref": "openroadm-topology", + "tp-ref": "XPDR1-NETWORK1", + "node-ref": "NodeA-XPDR1" + } + ] + } + ] + } + ], + "org-openroadm-network:node-status": "PLANNED", + "org-openroadm-otn-network-topology:node-type": "SWITCH", + "org-openroadm-otn-network-topology:xpdr-attributes": { + "xpdr-number": 1 + } + }, + { + "supporting-node": [ + { + "network-ref": "openroadm-topology", + "node-ref": "NodeB-XPDR1" + } + ], + "node-id": "NodeB-XPDR1", + "ietf-network-topology:termination-point": [ + { + "org-openroadm-otn-network-topology:tp-type": "XPONDER-CLIENT", + "org-openroadm-otn-network-topology:eqpt-srg-id": 1, + "tp-id": "XPDR1-CLIENT1", + "supporting-termination-point": [ + { + "network-ref": "openroadm-topology", + "tp-ref": "XPDR1-CLIENT1", + "node-ref": "NodeA-XPDR1" + } + ] + }, + { + "org-openroadm-otn-network-topology:tp-type": "XPONDER-CLIENT", + "org-openroadm-otn-network-topology:eqpt-srg-id": 1, + "tp-id": "XPDR1-CLIENT2", + "supporting-termination-point": [ + { + "network-ref": "openroadm-topology", + "tp-ref": "XPDR1-CLIENT2", + "node-ref": "NodeA-XPDR1" + }, + { + "org-openroadm-otn-network-topology:tp-type": "XPONDER-NETWORK", + "org-openroadm-otn-network-topology:eqpt-srg-id": 1, + "tp-id": "XPDR1-NETWORK1", + "supporting-termination-point": [ + { + "network-ref": "openroadm-topology", + "tp-ref": "XPDR1-NETWORK1", + "node-ref": "NodeA-XPDR1" + } + ] + } + ] + } + ], + "org-openroadm-network:node-status": "PLANNED", + "org-openroadm-otn-network-topology:node-type": "SWITCH", + "org-openroadm-otn-network-topology:xpdr-attributes": { + "xpdr-number": 1 + } + } + ] +} diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..94c7212 --- /dev/null +++ b/pom.xml @@ -0,0 +1,106 @@ + + + + + 4.0.0 + pom + + + org.onap.oparent + oparent + 2.1.0 + + + org.onap.integration.simulators.dc-simulator + integration-dc-simulator + 1.0.0-SNAPSHOT + + msasimulator + tapisimulator + + + https://nexus.onap.org + /content/repositories/snapshots/ + /content/repositories/releases/ + /content/repositories/staging/ + UTF-8 + 1.8 + 1.8 + 0.31.0 + true + ${project.reporting.outputDirectory}/jacoco-ut/jacoco.xml + + + + + org.springframework.boot + spring-boot-dependencies + 2.1.5.RELEASE + pom + import + + + org.springframework.boot + spring-boot-starter-test + 2.1.5.RELEASE + + + + + + + + maven-checkstyle-plugin + 2.17 + + checkstyle-suppressions.xml + checkstyle.suppressions.file + + + + io.fabric8 + docker-maven-plugin + 0.31.0 + + + + + + + + ecomp-releases + Integration simulators Release Repository + ${nexusproxy}${releaseNexusPath} + + + ecomp-snapshots + Integration simulators Snapshot Repository + ${nexusproxy}${snapshotNexusPath} + + + ecomp-site + dav:${nexusproxy}${sitePath} + + + + diff --git a/tapisimulator/.classpath b/tapisimulator/.classpath new file mode 100644 index 0000000..ede0663 --- /dev/null +++ b/tapisimulator/.classpath @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tapisimulator/.gitignore b/tapisimulator/.gitignore new file mode 100644 index 0000000..b83d222 --- /dev/null +++ b/tapisimulator/.gitignore @@ -0,0 +1 @@ +/target/ diff --git a/tapisimulator/.project b/tapisimulator/.project new file mode 100644 index 0000000..85317af --- /dev/null +++ b/tapisimulator/.project @@ -0,0 +1,23 @@ + + + tapisimulator + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.jdt.core.javanature + org.eclipse.m2e.core.maven2Nature + + diff --git a/tapisimulator/.settings/org.eclipse.core.resources.prefs b/tapisimulator/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000..04cfa2c --- /dev/null +++ b/tapisimulator/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,6 @@ +eclipse.preferences.version=1 +encoding//src/main/java=UTF-8 +encoding//src/main/resources=UTF-8 +encoding//src/test/java=UTF-8 +encoding//src/test/resources=UTF-8 +encoding/=UTF-8 diff --git a/tapisimulator/.settings/org.eclipse.jdt.core.prefs b/tapisimulator/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..d59e09c --- /dev/null +++ b/tapisimulator/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,5 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/tapisimulator/.settings/org.eclipse.m2e.core.prefs b/tapisimulator/.settings/org.eclipse.m2e.core.prefs new file mode 100644 index 0000000..14b697b --- /dev/null +++ b/tapisimulator/.settings/org.eclipse.m2e.core.prefs @@ -0,0 +1,4 @@ +activeProfiles= +eclipse.preferences.version=1 +resolveWorkspaceProjects=true +version=1 diff --git a/tapisimulator/Dockerfile b/tapisimulator/Dockerfile new file mode 100644 index 0000000..d6246f2 --- /dev/null +++ b/tapisimulator/Dockerfile @@ -0,0 +1,9 @@ +FROM java:openjdk-8 +ARG VERSION=${version} +ARG JAR_FILE=target/tapisimulator-${VERSION}.jar +COPY ${JAR_FILE} app.jar +COPY json-files/* /opt/onap/tapisimulator/templates/ +ADD entrypoint.sh . +RUN chmod +x entrypoint.sh +EXPOSE 8080 +ENTRYPOINT ["./entrypoint.sh"] diff --git a/tapisimulator/README.md b/tapisimulator/README.md new file mode 100644 index 0000000..85735a2 --- /dev/null +++ b/tapisimulator/README.md @@ -0,0 +1,87 @@ +TAPI Controller Simulator Project. + +The simulator is a simple spring boot application which acts as the TAPI controller for the MDONS use case + +The API'S are as follows: + +TAPI +1.Service interface points GET: /cxf/tapi/v2/connectivities/service-interface-points/{connection-point} +2.Create Service POST: /cxf/tapi/v2/connectivities/create-service/{service-name} +3.Delete Service: DELETE /cxf/tapi/v2/connectivities/delete-service/{service-name} +4.Get Service: GET /cxf/tapi/v2/connectivities/get-service/{service-name} +5.Get Topology : GET /cxf/tapi/v2/connectivities/topology + +##Sample create request + +{ + "create-connectivity-service-input-list":[ + { + "end-point":[ + { + "local-id": "/OTN/FW950074SDN-12/ODU0:1-2-2", + + "layer-protocol-name":"ODU", + "connection-end-point":[ + { + "topology-uuid": "754a91dc-dcd1-3530-8e95-a4880c298a1f", + "node-edge-point-uuid": "5d90ffed-8240-337b-82cf-3a550c2e12da", + "node-uuid": "492c08a7-6664-382b-8153-e8eed147b5b3", + "connection-end-point-uuid": "a8855567-8699-3703-8d54-b4ec2da694b9" + } + ], + "service-interface-point":{ + "service-interface-point-uuid":"a8855567-8699-3703-8d54-b4ec2da694b9" + }, + "protection-role":"WORK" + }, + { "local-id": "/OTN/FW950074SDN-15/ODU2:2-3-14-1", + "layer-protocol-name":"ODU", + "connection-end-point":[ + { + "topology-uuid": "754a91dc-dcd1-3530-8e95-a4880c298a1f", + "node-edge-point-uuid": "c4b07e05-871a-3811-881d-13983e3e28e0", + "node-uuid": "9373a6b7-8d29-35bb-a5c9-dd823da138ae", + "connection-end-point-uuid": "139c16e7-c13b-3f86-853e-1655afc2f167" + } + ], + "service-interface-point":{ + "service-interface-point-uuid":"139c16e7-c13b-3f86-853e-1655afc2f167" + }, + "protection-role":"WORK" + } + ], + "layer-protocol-name":"ODU", + "connectivity-constraint":{ + "service-type":"POINT_TO_POINT_CONNECTIVITY" + }, + "routing-constraint":{ + "route-objective-function":"MIN_WORK_ROUTE_COST" + }, + "topology-constraint":[ + + ], + "name":[ + { + "value-name":"service-name", + "value":"demo-nni" + } + ] + } + ] +} + +##To bring up locally along with the other instances go to the main directory dc-simluator +Execute docker-compose up + + +##To compile and build +mvn clean install + + +##To build docker image +mvn package -P docker + + + + + diff --git a/tapisimulator/entrypoint.sh b/tapisimulator/entrypoint.sh new file mode 100644 index 0000000..655ff42 --- /dev/null +++ b/tapisimulator/entrypoint.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +java -jar app.jar diff --git a/tapisimulator/json-files/tapi1-siplist.json b/tapisimulator/json-files/tapi1-siplist.json new file mode 100644 index 0000000..0521489 --- /dev/null +++ b/tapisimulator/json-files/tapi1-siplist.json @@ -0,0 +1,244 @@ +{ + "sip": [ + { + "layer-protocol-name": "ODU", + "uuid": "68d7ae41-9303-3d70-b9d0-a2d72d8cd9bb", + "administrative-state": "UNLOCKED", + "lifecycle-state": "INSTALLED", + "name": [ + { + "value-name": "tid", + "value": "Node1" + }, + { + "value-name": "name", + "value": "1-1-1" + }, + { + "value-name": "rate", + "value": "ODU2" + }, + { + "value-name": "direction", + "value": "BI" + } + ] + }, + { + "layer-protocol-name": "ODU", + "uuid": "faeda58e-839b-11ea-bc55-0242ac130003", + "administrative-state": "UNLOCKED", + "lifecycle-state": "INSTALLED", + "name": [ + { + "value-name": "tid", + "value": "Node2" + }, + { + "value-name": "name", + "value": "1-1-2" + }, + { + "value-name": "rate", + "value": "ODU2" + }, + { + "value-name": "direction", + "value": "BI" + } + ] + }, + { + "layer-protocol-name": "ODU", + "uuid": "b33552e2-839f-11ea-bc55-0242ac130003", + "administrative-state": "UNLOCKED", + "lifecycle-state": "INSTALLED", + "name": [ + { + "value-name": "tid", + "value": "Node1" + }, + { + "value-name": "name", + "value": "1-1-3" + }, + { + "value-name": "rate", + "value": "ODU2" + }, + { + "value-name": "direction", + "value": "BI" + } + ] + }, + { + "layer-protocol-name": "ODU", + "uuid": "da92a2ac-83a1-11ea-bc55-0242ac130003", + "administrative-state": "UNLOCKED", + "lifecycle-state": "INSTALLED", + "name": [ + { + "value-name": "tid", + "value": "Node2" + }, + { + "value-name": "name", + "value": "1-1-4" + }, + { + "value-name": "rate", + "value": "ODU2" + }, + { + "value-name": "direction", + "value": "BI" + } + ] + }, + { + "layer-protocol-name": "ODU", + "uuid": "ea9d25c8-83a1-11ea-bc55-0242ac130003", + "administrative-state": "UNLOCKED", + "lifecycle-state": "INSTALLED", + "name": [ + { + "value-name": "tid", + "value": "Node1" + }, + { + "value-name": "name", + "value": "1-1-5" + }, + { + "value-name": "rate", + "value": "ODU2" + }, + { + "value-name": "direction", + "value": "BI" + } + ] + }, + { + "layer-protocol-name": "ODU", + "uuid": "f0dc392e-83a1-11ea-bc55-0242ac130003", + "administrative-state": "UNLOCKED", + "lifecycle-state": "INSTALLED", + "name": [ + { + "value-name": "tid", + "value": "Node2" + }, + { + "value-name": "name", + "value": "1-1-6" + }, + { + "value-name": "rate", + "value": "ODU2" + }, + { + "value-name": "direction", + "value": "BI" + } + ] + }, + { + "layer-protocol-name": "ODU", + "uuid": "fbebc622-83a1-11ea-bc55-0242ac130003", + "administrative-state": "UNLOCKED", + "lifecycle-state": "INSTALLED", + "name": [ + { + "value-name": "tid", + "value": "Node1" + }, + { + "value-name": "name", + "value": "1-1-7" + }, + { + "value-name": "rate", + "value": "ODU2" + }, + { + "value-name": "direction", + "value": "BI" + } + ] + }, + { + "layer-protocol-name": "ODU", + "uuid": "0def1734-83a2-11ea-bc55-0242ac130003", + "administrative-state": "UNLOCKED", + "lifecycle-state": "INSTALLED", + "name": [ + { + "value-name": "tid", + "value": "Node2" + }, + { + "value-name": "name", + "value": "1-1-8" + }, + { + "value-name": "rate", + "value": "ODU2" + }, + { + "value-name": "direction", + "value": "BI" + } + ] + }, + { + "layer-protocol-name": "ODU", + "uuid": "16a77ace-83a2-11ea-bc55-0242ac130003", + "administrative-state": "UNLOCKED", + "lifecycle-state": "INSTALLED", + "name": [ + { + "value-name": "tid", + "value": "Node1" + }, + { + "value-name": "name", + "value": "1-2-1" + }, + { + "value-name": "rate", + "value": "ODU2" + }, + { + "value-name": "direction", + "value": "BI" + } + ] + }, + { + "layer-protocol-name": "ODU", + "uuid": "1f6fd6ce-83a2-11ea-bc55-0242ac130003", + "administrative-state": "UNLOCKED", + "lifecycle-state": "INSTALLED", + "name": [ + { + "value-name": "tid", + "value": "Node2" + }, + { + "value-name": "name", + "value": "1-2-2" + }, + { + "value-name": "rate", + "value": "ODU2" + }, + { + "value-name": "direction", + "value": "BI" + } + ] + } + ] +} diff --git a/tapisimulator/json-files/tapi1-topology.json b/tapisimulator/json-files/tapi1-topology.json new file mode 100644 index 0000000..8ecba8c --- /dev/null +++ b/tapisimulator/json-files/tapi1-topology.json @@ -0,0 +1,506 @@ +{ + "topology": [ + { + "uuid": "754a91dc-dcd1-3530-8e95-a4880c298a1f", + "link": [ + { + "uuid": "f93f61ae-b021-3e51-bcf0-226059ccc265", + "cost-characteristic": [ + { + "cost-name": "measured-latency", + "cost-value": "0" + }, + { + "cost-name": "cost", + "cost-value": "200" + } + ], + "node-edge-point": [ + { + "node-edge-point-uuid": "1ba61734-83a2-11ea-bc55-0242ac130fea9", + "node-uuid": "4df3b55a-bb8b-334d-9f82-284d1f728da2", + "topology-uuid": "754a91dc-dcd1-3530-8e95-a4880c298a1f" + }, + { + "node-edge-point-uuid": "78d7ae41-9303-3d70-b9d0-a2d72d8cd9aa", + "node-uuid": "5ec3b55a-bb8b-334d-9f82-284d1f728bc6", + "topology-uuid": "754a91dc-dcd1-3530-8e95-a4880c298a1f" + } + ], + "direction": "UNIDIRECTIONAL", + "administrative-state": "UNLOCKED", + "lifecycle-state": "INSTALLED", + "operational-state": "ENABLED", + "layer-protocol-name": [ + "ODU" + ] + } + ], + "layer-protocol-name": [ + "ODU" + ], + "node": [ + { + "encap-topology": { + "topology-uuid": "754a91dc-dcd1-3530-8e95-a4880c298a1f" + }, + "uuid": "5ec3b55a-bb8b-334d-9f82-284d1f728bc6", + "node-edge-point": [ + { + "tapi-connectivity:cep-list": { + "connection-end-point": [ + { + "uuid": "68d7ae41-9303-3d70-b9d0-a2d72d8cd9bb", + "name": [ + { + "value-name": "name", + "value": "1-1-1" + }, + { + "value-name": "direction", + "value": "BI" + } + ] + } + ] + }, + "link-port-direction": "BIDIRECTIONAL", + "layer-protocol-name": "ODU", + "uuid": "78d7ae41-9303-3d70-b9d0-a2d72d8cd9aa", + "administrative-state": "UNLOCKED", + "lifecycle-state": "INSTALLED", + "name": [ + { + "value-name": "tid", + "value": "Node1" + }, + { + "value-name": "name", + "value": "1-1-1" + }, + { + "value-name": "rate", + "value": "10GE" + }, + { + "value-name": "direction", + "value": "BI" + } + ] + }, + { + "tapi-connectivity:cep-list": { + "connection-end-point": [ + { + "uuid": "b33552e2-839f-11ea-bc55-0242ac130003", + "name": [ + { + "value-name": "name", + "value": "1-1-3" + }, + { + "value-name": "direction", + "value": "BI" + } + ] + } + ] + }, + "link-port-direction": "BIDIRECTIONAL", + "layer-protocol-name": "ODU", + "uuid": "c43552e2-839f-11ea-bc55-0242ac130065", + "administrative-state": "UNLOCKED", + "lifecycle-state": "INSTALLED", + "name": [ + { + "value-name": "tid", + "value": "Node1" + }, + { + "value-name": "name", + "value": "1-1-3" + }, + { + "value-name": "rate", + "value": "OC192" + }, + { + "value-name": "direction", + "value": "BI" + } + ] + }, + { + "tapi-connectivity:cep-list": { + "connection-end-point": [ + { + "uuid": "ea9d25c8-83a1-11ea-bc55-0242ac130003", + "name": [ + { + "value-name": "name", + "value": "1-1-5" + }, + { + "value-name": "direction", + "value": "BI" + } + ] + } + ] + }, + "link-port-direction": "BIDIRECTIONAL", + "layer-protocol-name": "ODU", + "uuid": "129d25c8-83a1-11ea-bc55-0242ac130896", + "administrative-state": "UNLOCKED", + "lifecycle-state": "INSTALLED", + "name": [ + { + "value-name": "tid", + "value": "Node1" + }, + { + "value-name": "name", + "value": "1-1-5" + }, + { + "value-name": "rate", + "value": "OTU2" + }, + { + "value-name": "direction", + "value": "BI" + } + ] + }, + { + "tapi-connectivity:cep-list": { + "connection-end-point": [ + { + "uuid": "fbebc622-83a1-11ea-bc55-0242ac130003", + "name": [ + { + "value-name": "name", + "value": "1-1-7" + }, + { + "value-name": "direction", + "value": "BI" + } + ] + } + ] + }, + "link-port-direction": "BIDIRECTIONAL", + "layer-protocol-name": "ODU", + "uuid": "536abc622-83a1-2596-bc55-0242ac139625", + "administrative-state": "UNLOCKED", + "lifecycle-state": "INSTALLED", + "name": [ + { + "value-name": "tid", + "value": "Node1" + }, + { + "value-name": "name", + "value": "1-1-7" + }, + { + "value-name": "rate", + "value": "10GE" + }, + { + "value-name": "direction", + "value": "BI" + } + ] + }, + { + "tapi-connectivity:cep-list": { + "connection-end-point": [ + { + "uuid": "16a77ace-83a2-11ea-bc55-0242ac130003", + "name": [ + { + "value-name": "name", + "value": "1-2-1" + }, + { + "value-name": "direction", + "value": "BI" + } + ] + } + ] + }, + "link-port-direction": "BIDIRECTIONAL", + "layer-protocol-name": "ODU", + "uuid": "366abc622-83a1-2596-bc55-0242ac139adc8", + "administrative-state": "UNLOCKED", + "lifecycle-state": "INSTALLED", + "name": [ + { + "value-name": "tid", + "value": "Node1" + }, + { + "value-name": "name", + "value": "1-2-1" + }, + { + "value-name": "rate", + "value": "OTU2" + }, + { + "value-name": "direction", + "value": "BI" + } + ] + } + ], + "layer-protocol-name": [ + "ODU" + ], + "name": [ + { + "value-name": "name", + "value": "Node1" + } + ] + }, + { + "encap-topology": { + "topology-uuid": "754a91dc-dcd1-3530-8e95-a4880c298a1f" + }, + "uuid": "4df3b55a-bb8b-334d-9f82-284d1f728da2", + "node-edge-point": [ + { + "tapi-connectivity:cep-list": { + "connection-end-point": [ + { + "uuid": "faeda58e-839b-11ea-bc55-0242ac130003", + "name": [ + { + "value-name": "name", + "value": "1-1-2" + }, + { + "value-name": "direction", + "value": "BI" + } + ] + } + ] + }, + "link-port-direction": "BIDIRECTIONAL", + "layer-protocol-name": "ODU", + "uuid": "bfcda58e-839b-11ea-bc55-0242ac130569", + "administrative-state": "UNLOCKED", + "lifecycle-state": "INSTALLED", + "name": [ + { + "value-name": "tid", + "value": "Node2" + }, + { + "value-name": "name", + "value": "1-1-2" + }, + { + "value-name": "rate", + "value": "10GE" + }, + { + "value-name": "direction", + "value": "BI" + } + ] + }, + { + "tapi-connectivity:cep-list": { + "connection-end-point": [ + { + "uuid": "da92a2ac-83a1-11ea-bc55-0242ac130003", + "name": [ + { + "value-name": "name", + "value": "1-1-4" + }, + { + "value-name": "direction", + "value": "BI" + } + ] + } + ] + }, + "link-port-direction": "BIDIRECTIONAL", + "layer-protocol-name": "ODU", + "uuid": "ca42a2ac-83a1-11ea-bc55-0242ac130003", + "administrative-state": "UNLOCKED", + "lifecycle-state": "INSTALLED", + "name": [ + { + "value-name": "tid", + "value": "Node2" + }, + { + "value-name": "name", + "value": "1-1-4" + }, + { + "value-name": "rate", + "value": "OC192" + }, + { + "value-name": "direction", + "value": "BI" + } + ] + }, + { + "tapi-connectivity:cep-list": { + "connection-end-point": [ + { + "uuid": "f0dc392e-83a1-11ea-bc55-0242ac130003", + "name": [ + { + "value-name": "name", + "value": "1-1-6" + }, + { + "value-name": "direction", + "value": "BI" + } + ] + } + ] + }, + "link-port-direction": "BIDIRECTIONAL", + "layer-protocol-name": "ODU", + "uuid": "12dc392e-83a1-11ea-bc55-0242ac1300cba", + "administrative-state": "UNLOCKED", + "lifecycle-state": "INSTALLED", + "name": [ + { + "value-name": "tid", + "value": "Node2" + }, + { + "value-name": "name", + "value": "1-1-6" + }, + { + "value-name": "rate", + "value": "OTU2" + }, + { + "value-name": "direction", + "value": "BI" + } + ] + }, + { + "tapi-connectivity:cep-list": { + "connection-end-point": [ + { + "uuid": "0def1734-83a2-11ea-bc55-0242ac130003", + "name": [ + { + "value-name": "name", + "value": "1-1-8" + }, + { + "value-name": "direction", + "value": "BI" + } + ] + } + ] + }, + "link-port-direction": "BIDIRECTIONAL", + "layer-protocol-name": "ODU", + "uuid": "1ba61734-83a2-11ea-bc55-0242ac130fea9", + "administrative-state": "UNLOCKED", + "lifecycle-state": "INSTALLED", + "name": [ + { + "value-name": "tid", + "value": "Node2" + }, + { + "value-name": "name", + "value": "1-1-8" + }, + { + "value-name": "rate", + "value": "10GE" + }, + { + "value-name": "direction", + "value": "BI" + } + ] + }, + { + "tapi-connectivity:cep-list": { + "connection-end-point": [ + { + "uuid": "1f6fd6ce-83a2-11ea-bc55-0242ac130003", + "name": [ + { + "value-name": "name", + "value": "1-2-2" + }, + { + "value-name": "direction", + "value": "BI" + } + ] + } + ] + }, + "link-port-direction": "BIDIRECTIONAL", + "layer-protocol-name": "ODU", + "uuid": "9f6fd6ce-83a2-11ea-bc55-0242ac1300896", + "administrative-state": "UNLOCKED", + "lifecycle-state": "INSTALLED", + "name": [ + { + "value-name": "tid", + "value": "Node2" + }, + { + "value-name": "name", + "value": "1-2-2" + }, + { + "value-name": "rate", + "value": "OTU2" + }, + { + "value-name": "direction", + "value": "BI" + } + ] + } + ], + "layer-protocol-name": [ + "ODU" + ], + "name": [ + { + "value-name": "name", + "value": "Node2" + } + ] + } + ], + "name": [ + { + "value-name": "name", + "value": "OTN" + } + ] + } + ] +} diff --git a/tapisimulator/json-files/tapi2-siplist.json b/tapisimulator/json-files/tapi2-siplist.json new file mode 100644 index 0000000..31ff2b6 --- /dev/null +++ b/tapisimulator/json-files/tapi2-siplist.json @@ -0,0 +1,244 @@ +{ + "sip": [ + { + "layer-protocol-name": "ODU", + "uuid": "c2814cd7-ea49-4ae1-af19-d4beb3629d1d", + "administrative-state": "UNLOCKED", + "lifecycle-state": "INSTALLED", + "name": [ + { + "value-name": "tid", + "value": "Node3" + }, + { + "value-name": "name", + "value": "1-1-1" + }, + { + "value-name": "rate", + "value": "ODU2" + }, + { + "value-name": "direction", + "value": "BI" + } + ] + }, + { + "layer-protocol-name": "ODU", + "uuid": "82392841-141f-4951-933d-acd3d62c8883", + "administrative-state": "UNLOCKED", + "lifecycle-state": "INSTALLED", + "name": [ + { + "value-name": "tid", + "value": "Node3" + }, + { + "value-name": "name", + "value": "1-1-2" + }, + { + "value-name": "rate", + "value": "ODU2" + }, + { + "value-name": "direction", + "value": "BI" + } + ] + }, + { + "layer-protocol-name": "ODU", + "uuid": "d0d6f882-6bd6-4ef2-bf28-7748e21a7126", + "administrative-state": "UNLOCKED", + "lifecycle-state": "INSTALLED", + "name": [ + { + "value-name": "tid", + "value": "Node3" + }, + { + "value-name": "name", + "value": "1-1-3" + }, + { + "value-name": "rate", + "value": "ODU2" + }, + { + "value-name": "direction", + "value": "BI" + } + ] + }, + { + "layer-protocol-name": "ODU", + "uuid": "a6cc8687-ccb4-4a6f-82bb-404674e824c0", + "administrative-state": "UNLOCKED", + "lifecycle-state": "INSTALLED", + "name": [ + { + "value-name": "tid", + "value": "Node3" + }, + { + "value-name": "name", + "value": "1-1-4" + }, + { + "value-name": "rate", + "value": "ODU2" + }, + { + "value-name": "direction", + "value": "BI" + } + ] + }, + { + "layer-protocol-name": "ODU", + "uuid": "d5c91b35-f3b4-4fca-8713-ce843309a4e8", + "administrative-state": "UNLOCKED", + "lifecycle-state": "INSTALLED", + "name": [ + { + "value-name": "tid", + "value": "Node3" + }, + { + "value-name": "name", + "value": "1-1-5" + }, + { + "value-name": "rate", + "value": "ODU2" + }, + { + "value-name": "direction", + "value": "BI" + } + ] + }, + { + "layer-protocol-name": "ODU", + "uuid": "9b443fea-22c2-4b6a-9679-ebc5685b19cc", + "administrative-state": "UNLOCKED", + "lifecycle-state": "INSTALLED", + "name": [ + { + "value-name": "tid", + "value": "Node4" + }, + { + "value-name": "name", + "value": "1-1-6" + }, + { + "value-name": "rate", + "value": "ODU2" + }, + { + "value-name": "direction", + "value": "BI" + } + ] + }, + { + "layer-protocol-name": "ODU", + "uuid": "2a824296-ad21-4ee4-acb5-8ed9ffabbb22", + "administrative-state": "UNLOCKED", + "lifecycle-state": "INSTALLED", + "name": [ + { + "value-name": "tid", + "value": "Node4" + }, + { + "value-name": "name", + "value": "1-1-7" + }, + { + "value-name": "rate", + "value": "ODU2" + }, + { + "value-name": "direction", + "value": "BI" + } + ] + }, + { + "layer-protocol-name": "ODU", + "uuid": "5e399f6c-32cb-4b31-ad91-ec91a8935378", + "administrative-state": "UNLOCKED", + "lifecycle-state": "INSTALLED", + "name": [ + { + "value-name": "tid", + "value": "Node4" + }, + { + "value-name": "name", + "value": "1-1-8" + }, + { + "value-name": "rate", + "value": "ODU2" + }, + { + "value-name": "direction", + "value": "BI" + } + ] + }, + { + "layer-protocol-name": "ODU", + "uuid": "4ff1ac3f-77fa-423a-acb7-b908c682be52", + "administrative-state": "UNLOCKED", + "lifecycle-state": "INSTALLED", + "name": [ + { + "value-name": "tid", + "value": "Node4" + }, + { + "value-name": "name", + "value": "1-2-1" + }, + { + "value-name": "rate", + "value": "ODU2" + }, + { + "value-name": "direction", + "value": "BI" + } + ] + }, + { + "layer-protocol-name": "ODU", + "uuid": "cbb7716c-864c-4db8-9dce-31ae0ce13cdc", + "administrative-state": "UNLOCKED", + "lifecycle-state": "INSTALLED", + "name": [ + { + "value-name": "tid", + "value": "Node4" + }, + { + "value-name": "name", + "value": "1-2-2" + }, + { + "value-name": "rate", + "value": "ODU2" + }, + { + "value-name": "direction", + "value": "BI" + } + ] + } + ] +} diff --git a/tapisimulator/json-files/tapi2-topology.json b/tapisimulator/json-files/tapi2-topology.json new file mode 100644 index 0000000..53466c0 --- /dev/null +++ b/tapisimulator/json-files/tapi2-topology.json @@ -0,0 +1,506 @@ +{ + "topology": [ + { + "uuid": "754a91dc-dcd1-3530-8e95-a4880c298a1f", + "link": [ + { + "uuid": "b3ed13ec-ce2c-4195-b521-a92ce730e851", + "cost-characteristic": [ + { + "cost-name": "measured-latency", + "cost-value": "0" + }, + { + "cost-name": "cost", + "cost-value": "200" + } + ], + "node-edge-point": [ + { + "node-edge-point-uuid": "dd13ea51-eb2d-4a42-af3d-d3d17336a820", + "node-uuid": "3a39735a-e5f0-4c74-a29d-cc278c02d4d3", + "topology-uuid": "754a91dc-dcd1-3530-8e95-a4880c298a1f" + }, + { + "node-edge-point-uuid": "4ef204af-3c54-418e-b9e6-aa01e567135a", + "node-uuid": "2539bad0-5add-4406-8ca6-5ae38b50869a", + "topology-uuid": "754a91dc-dcd1-3530-8e95-a4880c298a1f" + } + ], + "direction": "UNIDIRECTIONAL", + "administrative-state": "UNLOCKED", + "lifecycle-state": "INSTALLED", + "operational-state": "ENABLED", + "layer-protocol-name": [ + "ODU" + ] + } + ], + "layer-protocol-name": [ + "ODU" + ], + "node": [ + { + "encap-topology": { + "topology-uuid": "754a91dc-dcd1-3530-8e95-a4880c298a1f" + }, + "uuid": "2539bad0-5add-4406-8ca6-5ae38b50869a", + "node-edge-point": [ + { + "tapi-connectivity:cep-list": { + "connection-end-point": [ + { + "uuid": "c2814cd7-ea49-4ae1-af19-d4beb3629d1d", + "name": [ + { + "value-name": "name", + "value": "1-1-1" + }, + { + "value-name": "direction", + "value": "BI" + } + ] + } + ] + }, + "link-port-direction": "BIDIRECTIONAL", + "layer-protocol-name": "ODU", + "uuid": "4ef204af-3c54-418e-b9e6-aa01e567135a", + "administrative-state": "UNLOCKED", + "lifecycle-state": "INSTALLED", + "name": [ + { + "value-name": "tid", + "value": "Node3" + }, + { + "value-name": "name", + "value": "1-1-1" + }, + { + "value-name": "rate", + "value": "10GE" + }, + { + "value-name": "direction", + "value": "BI" + } + ] + }, + { + "tapi-connectivity:cep-list": { + "connection-end-point": [ + { + "uuid": "82392841-141f-4951-933d-acd3d62c8883", + "name": [ + { + "value-name": "name", + "value": "1-1-2" + }, + { + "value-name": "direction", + "value": "BI" + } + ] + } + ] + }, + "link-port-direction": "BIDIRECTIONAL", + "layer-protocol-name": "ODU", + "uuid": "1ca8b70d-0a0b-481a-b3e0-0bcac0903d44", + "administrative-state": "UNLOCKED", + "lifecycle-state": "INSTALLED", + "name": [ + { + "value-name": "tid", + "value": "Node3" + }, + { + "value-name": "name", + "value": "1-1-2" + }, + { + "value-name": "rate", + "value": "OC192" + }, + { + "value-name": "direction", + "value": "BI" + } + ] + }, + { + "tapi-connectivity:cep-list": { + "connection-end-point": [ + { + "uuid": "d0d6f882-6bd6-4ef2-bf28-7748e21a7126", + "name": [ + { + "value-name": "name", + "value": "1-1-3" + }, + { + "value-name": "direction", + "value": "BI" + } + ] + } + ] + }, + "link-port-direction": "BIDIRECTIONAL", + "layer-protocol-name": "ODU", + "uuid": "8b183457-c9be-4e8b-89ac-fd916c7ea9d9", + "administrative-state": "UNLOCKED", + "lifecycle-state": "INSTALLED", + "name": [ + { + "value-name": "tid", + "value": "Node3" + }, + { + "value-name": "name", + "value": "1-1-3" + }, + { + "value-name": "rate", + "value": "OTU2" + }, + { + "value-name": "direction", + "value": "BI" + } + ] + }, + { + "tapi-connectivity:cep-list": { + "connection-end-point": [ + { + "uuid": "a6cc8687-ccb4-4a6f-82bb-404674e824c0", + "name": [ + { + "value-name": "name", + "value": "1-1-4" + }, + { + "value-name": "direction", + "value": "BI" + } + ] + } + ] + }, + "link-port-direction": "BIDIRECTIONAL", + "layer-protocol-name": "ODU", + "uuid": "81aca7b6-2073-4bf5-ace9-48bcc911f5df", + "administrative-state": "UNLOCKED", + "lifecycle-state": "INSTALLED", + "name": [ + { + "value-name": "tid", + "value": "Node3" + }, + { + "value-name": "name", + "value": "1-1-4" + }, + { + "value-name": "rate", + "value": "10GE" + }, + { + "value-name": "direction", + "value": "BI" + } + ] + }, + { + "tapi-connectivity:cep-list": { + "connection-end-point": [ + { + "uuid": "d5c91b35-f3b4-4fca-8713-ce843309a4e8", + "name": [ + { + "value-name": "name", + "value": "1-1-5" + }, + { + "value-name": "direction", + "value": "BI" + } + ] + } + ] + }, + "link-port-direction": "BIDIRECTIONAL", + "layer-protocol-name": "ODU", + "uuid": "ee5a8f50-c54e-42a2-bbe9-09ab93cfb1d1", + "administrative-state": "UNLOCKED", + "lifecycle-state": "INSTALLED", + "name": [ + { + "value-name": "tid", + "value": "Node3" + }, + { + "value-name": "name", + "value": "1-1-5" + }, + { + "value-name": "rate", + "value": "OTU2" + }, + { + "value-name": "direction", + "value": "BI" + } + ] + } + ], + "layer-protocol-name": [ + "ODU" + ], + "name": [ + { + "value-name": "name", + "value": "Node3" + } + ] + }, + { + "encap-topology": { + "topology-uuid": "754a91dc-dcd1-3530-8e95-a4880c298a1f" + }, + "uuid": "3a39735a-e5f0-4c74-a29d-cc278c02d4d3", + "node-edge-point": [ + { + "tapi-connectivity:cep-list": { + "connection-end-point": [ + { + "uuid": "9b443fea-22c2-4b6a-9679-ebc5685b19cc", + "name": [ + { + "value-name": "name", + "value": "1-1-6" + }, + { + "value-name": "direction", + "value": "BI" + } + ] + } + ] + }, + "link-port-direction": "BIDIRECTIONAL", + "layer-protocol-name": "ODU", + "uuid": "d8be03a2-bcb1-4f67-a5b6-e55338d2ef0e", + "administrative-state": "UNLOCKED", + "lifecycle-state": "INSTALLED", + "name": [ + { + "value-name": "tid", + "value": "Node4" + }, + { + "value-name": "name", + "value": "1-1-6" + }, + { + "value-name": "rate", + "value": "10GE" + }, + { + "value-name": "direction", + "value": "BI" + } + ] + }, + { + "tapi-connectivity:cep-list": { + "connection-end-point": [ + { + "uuid": "2a824296-ad21-4ee4-acb5-8ed9ffabbb22", + "name": [ + { + "value-name": "name", + "value": "1-1-7" + }, + { + "value-name": "direction", + "value": "BI" + } + ] + } + ] + }, + "link-port-direction": "BIDIRECTIONAL", + "layer-protocol-name": "ODU", + "uuid": "23be8019-a2c5-45c1-8a6d-547987354a95", + "administrative-state": "UNLOCKED", + "lifecycle-state": "INSTALLED", + "name": [ + { + "value-name": "tid", + "value": "Node4" + }, + { + "value-name": "name", + "value": "1-1-7" + }, + { + "value-name": "rate", + "value": "OC192" + }, + { + "value-name": "direction", + "value": "BI" + } + ] + }, + { + "tapi-connectivity:cep-list": { + "connection-end-point": [ + { + "uuid": "5e399f6c-32cb-4b31-ad91-ec91a8935378", + "name": [ + { + "value-name": "name", + "value": "1-1-8" + }, + { + "value-name": "direction", + "value": "BI" + } + ] + } + ] + }, + "link-port-direction": "BIDIRECTIONAL", + "layer-protocol-name": "ODU", + "uuid": "dd13ea51-eb2d-4a42-af3d-d3d17336a820", + "administrative-state": "UNLOCKED", + "lifecycle-state": "INSTALLED", + "name": [ + { + "value-name": "tid", + "value": "Node4" + }, + { + "value-name": "name", + "value": "1-1-8" + }, + { + "value-name": "rate", + "value": "OTU2" + }, + { + "value-name": "direction", + "value": "BI" + } + ] + }, + { + "tapi-connectivity:cep-list": { + "connection-end-point": [ + { + "uuid": "4ff1ac3f-77fa-423a-acb7-b908c682be52", + "name": [ + { + "value-name": "name", + "value": "1-2-1" + }, + { + "value-name": "direction", + "value": "BI" + } + ] + } + ] + }, + "link-port-direction": "BIDIRECTIONAL", + "layer-protocol-name": "ODU", + "uuid": "1bd434f4-6f9e-4c69-b865-c76cbafdf791", + "administrative-state": "UNLOCKED", + "lifecycle-state": "INSTALLED", + "name": [ + { + "value-name": "tid", + "value": "Node4" + }, + { + "value-name": "name", + "value": "1-2-1" + }, + { + "value-name": "rate", + "value": "10GE" + }, + { + "value-name": "direction", + "value": "BI" + } + ] + }, + { + "tapi-connectivity:cep-list": { + "connection-end-point": [ + { + "uuid": "cbb7716c-864c-4db8-9dce-31ae0ce13cdc", + "name": [ + { + "value-name": "name", + "value": "1-2-2" + }, + { + "value-name": "direction", + "value": "BI" + } + ] + } + ] + }, + "link-port-direction": "BIDIRECTIONAL", + "layer-protocol-name": "ODU", + "uuid": "e45c5a34-59a5-4e7d-9aca-fc8d09e60ec0", + "administrative-state": "UNLOCKED", + "lifecycle-state": "INSTALLED", + "name": [ + { + "value-name": "tid", + "value": "Node4" + }, + { + "value-name": "name", + "value": "1-2-2" + }, + { + "value-name": "rate", + "value": "OTU2" + }, + { + "value-name": "direction", + "value": "BI" + } + ] + } + ], + "layer-protocol-name": [ + "ODU" + ], + "name": [ + { + "value-name": "name", + "value": "Node4" + } + ] + } + ], + "name": [ + { + "value-name": "name", + "value": "OTN" + } + ] + } + ] +} diff --git a/tapisimulator/pom.xml b/tapisimulator/pom.xml new file mode 100644 index 0000000..a8825a0 --- /dev/null +++ b/tapisimulator/pom.xml @@ -0,0 +1,315 @@ + + + + + + 4.0.0 + + + org.onap.integration.simulators.dc-simulator + integration-dc-simulator + 1.0.0-SNAPSHOT + + + + + tapisimulator + 1.0.0-SNAPSHOT + + tapisimulator + + + UTF-8 + 1.8 + 1.8 + yyyyMMdd'T'HHmmss + + org.onap.tapisimulator.Application + latest + 5.1.0 + 5.1.0 + 2.1.5.RELEASE + onap/${project.artifactId} + + libs + ${project.build.directory}/${dependency.directory.name} + + + nexus3.onap.org:10003 + http://nexus3.onap.org + + + + + org.springframework.boot + spring-boot-starter-web + ${spring.boot.version} + + + org.springframework.boot + spring-boot-starter-data-mongodb + ${spring.boot.version} + + + org.springframework.boot + spring-boot-starter-actuator + ${spring.boot.version} + + + org.springframework.cloud + spring-cloud-config-client + 2.1.4.RELEASE + + + ch.qos.logback + logback-classic + + + ch.qos.logback + logback-core + 1.2.3 + + + org.slf4j + slf4j-api + 1.7.25 + + + commons-io + commons-io + 2.6 + + + org.json + json + 20180130 + + + com.google.code.gson + gson + 2.8.2 + + + org.apache.httpcomponents + httpclient + + + com.google.guava + guava + + + commons-cli + commons-cli + 1.4 + + + org.apache.commons + commons-lang3 + 3.7 + + + org.projectlombok + lombok + 1.18.2 + provided + + + com.fasterxml.jackson.datatype + jackson-datatype-jdk8 + 2.9.7 + + + com.fasterxml.jackson.datatype + jackson-datatype-jsr310 + 2.9.7 + + + io.vavr + vavr-match + 0.9.2 + + + io.vavr + vavr + 0.9.2 + + + + + + org.assertj + assertj-core + 3.9.1 + test + + + org.mockito + mockito-core + 2.23.4 + test + + + junit + junit + 4.12 + test + + + + + org.springframework.boot + spring-boot-starter-test + ${spring.boot.version} + test + + + org.quartz-scheduler + quartz + 2.2.1 + + + org.quartz-scheduler + quartz-jobs + 2.2.1 + + + + + + org.springframework.boot + spring-boot-maven-plugin + 2.1.5.RELEASE + + org.onap.tapisimulator.Application + + + + + repackage + + + + + + + org.apache.maven.plugins + maven-jar-plugin + 3.1.0 + + + + org.onap.tapisimulator.Application + + + + + + org.apache.maven.plugins + maven-surefire-plugin + + + TAPI1 + + + + + + + + + + + docker + + false + + + linux + x86_64 + ${os.detected.name}-${os.detected.arch} + + + + + io.fabric8 + docker-maven-plugin + ${docker-maven-plugin.version} + + + docker-build-image + package + + build + + + + docker-push-image + deploy + + push + + + + + ${skipDockerPush} + true + IfNotPresent + + + ${project.artifactId} + ${onap.nexus.dockerregistry.daily}/${docker.image.name} + ${onap.nexus.dockerregistry.daily} + + ${project.basedir} + + ${project.version}-STAGE-${maven.build.timestamp}Z + + + + + + + + + + + + + + + ecomp-releases + Integration simulators Release Repository + ${nexusproxy}${releaseNexusPath} + + + ecomp-snapshots + Integration simulators Snapshot Repository + ${nexusproxy}${snapshotNexusPath} + + + ecomp-site + dav:${nexusproxy}${sitePath} + + + + diff --git a/tapisimulator/src/main/java/org/onap/tapisimulator/Application.java b/tapisimulator/src/main/java/org/onap/tapisimulator/Application.java new file mode 100644 index 0000000..fede151 --- /dev/null +++ b/tapisimulator/src/main/java/org/onap/tapisimulator/Application.java @@ -0,0 +1,33 @@ +/* + * ============LICENSE_START======================================================= + * TAPI-SIMULATOR + * ================================================================================ + * Copyright (C) 2020 Fujitsu Limited. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.onap.tapisimulator; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Application { + + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } + +} diff --git a/tapisimulator/src/main/java/org/onap/tapisimulator/controller/TapiController.java b/tapisimulator/src/main/java/org/onap/tapisimulator/controller/TapiController.java new file mode 100644 index 0000000..4b246ef --- /dev/null +++ b/tapisimulator/src/main/java/org/onap/tapisimulator/controller/TapiController.java @@ -0,0 +1,73 @@ +/* + * ============LICENSE_START======================================================= + * TAPI-SIMULATOR + * ================================================================================ + * Copyright (C) 2020 Fujitsu Limited. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.onap.tapisimulator.controller; + +import org.onap.tapisimulator.model.SipList; +import org.onap.tapisimulator.service.TapiService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class TapiController { + + @Autowired + TapiService tapiService; + + @GetMapping("/cxf/tapi/v2/connectivities/service-interface-points/{connection-point}") + public SipList getTapiServiceInterfacePoint(@PathVariable("connection-point") String cep) { + + return tapiService.getServiceInterfacePoints(cep); + + } + + @PostMapping("/cxf/tapi/v2/connectivities/create-service/{service-name}") + public String createTapiService(@PathVariable("service-name") String name, @RequestBody String requestbody) { + tapiService.processService(requestbody); + return "Service created Successfully"; + } + + @GetMapping("/cxf/tapi/v2/connectivities/get-service/{service-name}") + public String getTapiService(@PathVariable("service-name") String name) { + + return tapiService.returnService(name); + + } + + @DeleteMapping("/cxf/tapi/v2/connectivities/delete-service/{service-name}") + public String deleteTapiService(@PathVariable("service-name") String name) { + tapiService.processDeleteService(name); + return "Service deleted successfully"; + + } + + @GetMapping("/cxf/tapi/v2/connectivities/topology") + public String getTapiTopology() { + + return tapiService.getTopology(); + + } + +} diff --git a/tapisimulator/src/main/java/org/onap/tapisimulator/model/Name.java b/tapisimulator/src/main/java/org/onap/tapisimulator/model/Name.java new file mode 100644 index 0000000..e5a6441 --- /dev/null +++ b/tapisimulator/src/main/java/org/onap/tapisimulator/model/Name.java @@ -0,0 +1,39 @@ +/* + * ============LICENSE_START======================================================= + * TAPI-SIMULATOR + * ================================================================================ + * Copyright (C) 2020 Fujitsu Limited. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.onap.tapisimulator.model; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class Name { + + @JsonProperty(value = "value-name") + private String valueName; + + private String value; + +} diff --git a/tapisimulator/src/main/java/org/onap/tapisimulator/model/Sip.java b/tapisimulator/src/main/java/org/onap/tapisimulator/model/Sip.java new file mode 100644 index 0000000..fb39855 --- /dev/null +++ b/tapisimulator/src/main/java/org/onap/tapisimulator/model/Sip.java @@ -0,0 +1,49 @@ +/* + * ============LICENSE_START======================================================= + * TAPI-SIMULATOR + * ================================================================================ + * Copyright (C) 2020 Fujitsu Limited. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.onap.tapisimulator.model; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.util.List; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class Sip { + + @JsonProperty(value = "administrative-state") + private String administrativeState; + + @JsonProperty(value = "lifecycle-state") + private String lifecycleState; + + @JsonProperty(value = "layer-protocol-name") + private String layerProtocolName; + + private List name; + + private String uuid; + +} diff --git a/tapisimulator/src/main/java/org/onap/tapisimulator/model/SipList.java b/tapisimulator/src/main/java/org/onap/tapisimulator/model/SipList.java new file mode 100644 index 0000000..3a75be9 --- /dev/null +++ b/tapisimulator/src/main/java/org/onap/tapisimulator/model/SipList.java @@ -0,0 +1,36 @@ +/* + * ============LICENSE_START======================================================= + * TAPI-SIMULATOR + * ================================================================================ + * Copyright (C) 2020 Fujitsu Limited. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.onap.tapisimulator.model; + +import java.util.List; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class SipList { + + private List sip; + +} diff --git a/tapisimulator/src/main/java/org/onap/tapisimulator/service/TapiService.java b/tapisimulator/src/main/java/org/onap/tapisimulator/service/TapiService.java new file mode 100644 index 0000000..49b5689 --- /dev/null +++ b/tapisimulator/src/main/java/org/onap/tapisimulator/service/TapiService.java @@ -0,0 +1,156 @@ +/* + * ============LICENSE_START======================================================= + * TAPI-SIMULATOR + * ================================================================================ + * Copyright (C) 2020 Fujitsu Limited. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.onap.tapisimulator.service; + +import com.fasterxml.jackson.databind.ObjectMapper; + +import java.io.IOException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import java.util.stream.Collectors; + +import javax.annotation.PostConstruct; + +import org.json.JSONArray; +import org.json.JSONObject; +import org.onap.tapisimulator.model.Sip; +import org.onap.tapisimulator.model.SipList; +import org.onap.tapisimulator.utils.Utils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class TapiService { + + private static Logger log = LoggerFactory.getLogger(TapiService.class); + + private volatile Map serviceMap = new HashMap<>(); + + @Autowired + ObjectMapper mapper; + + @Autowired + Utils utils; + + private SipList siplist = null; + + private List sip = null; + + private String topology; + + @PostConstruct + public void init() throws IOException { + String domainController = System.getenv("Controller"); + String servicePoints = ""; + if (domainController.equals("TAPI1")) { + servicePoints = utils.readFromFile("/opt/onap/tapisimulator/templates/tapi1-siplist.json"); + topology = utils.readFromFile("/opt/onap/tapisimulator/templates/tapi1-topology.json"); + siplist = mapper.readValue(servicePoints, SipList.class); + sip = siplist.getSip(); + log.debug("Inside init method of TapiService class"); + } else if (domainController.equals("TAPI2")) { + servicePoints = utils.readFromFile("/opt/onap/tapisimulator/templates/tapi2-siplist.json"); + topology = utils.readFromFile("/opt/onap/tapisimulator/templates/tapi2-topology.json"); + siplist = mapper.readValue(servicePoints, SipList.class); + sip = siplist.getSip(); + log.debug("Inside init method of TapiService class"); + } + + } + + public SipList getServiceInterfacePoints(String connectionPoint) { + + List curSip = sip.stream().filter(c -> c.getUuid().equals(connectionPoint)).collect(Collectors.toList()); + + SipList newSip = new SipList(); + newSip.setSip(curSip); + return newSip; + } + + public Map getServiceMap() { + return serviceMap; + } + + public void setServiceMap(String key, String value) { + serviceMap.put(key, value); + } + + public void processService(String request) { + JSONObject json = new JSONObject(request); + JSONArray conectivityList = json.getJSONArray("create-connectivity-service-input-list"); + JSONObject connec = conectivityList.getJSONObject(0); + JSONArray eplist = connec.getJSONArray("end-point"); + JSONArray name = connec.getJSONArray("name"); + String serviceName = name.getJSONObject(0).getString("value"); + + createSErviceMap(eplist, serviceName, name); + + } + + public String returnService(String name) { + + return serviceMap.get(name); + + } + + public String processDeleteService(String name) { + + return serviceMap.remove(name); + + } + + public String getTopology() { + + return topology; + + } + + private void createSErviceMap(JSONArray eplist, String serviceName, JSONArray name) { + JSONObject serviceEntry = new JSONObject(); + serviceEntry.put("end-point", eplist); + serviceEntry.put("topology-constraint", new JSONArray()); + serviceEntry.put("routing-constraint", new JSONObject()); + serviceEntry.put("connectivity-constraint", new JSONObject()); + serviceEntry.put("uuid", UUID.randomUUID().toString()); + serviceEntry.put("layer-protocol-name", "ODU"); + serviceEntry.put("direction", "BIDIRECTIONAL"); + serviceEntry.put("administrative-state", "UNLOCKED"); + serviceEntry.put("operational-state", "ENABLED"); + JSONArray connection = new JSONArray(); + JSONObject connectionObject = new JSONObject(); + connectionObject.put("connection-uuid", UUID.randomUUID().toString()); + connection.put(0, connectionObject); + serviceEntry.put("connection", connection); + serviceEntry.put("name", name); + + JSONObject service = new JSONObject(); + JSONArray serviceList = new JSONArray(); + serviceList.put(0, serviceEntry); + service.put("service", serviceList); + + serviceMap.put(serviceName, service.toString()); + } + +} diff --git a/tapisimulator/src/main/java/org/onap/tapisimulator/utils/Utils.java b/tapisimulator/src/main/java/org/onap/tapisimulator/utils/Utils.java new file mode 100644 index 0000000..8d2ac4d --- /dev/null +++ b/tapisimulator/src/main/java/org/onap/tapisimulator/utils/Utils.java @@ -0,0 +1,64 @@ +/* + * ============LICENSE_START======================================================= + * TAPI-SIMULATOR + * ================================================================================ + * Copyright (C) 2020 Fujitsu Limited. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.onap.tapisimulator.utils; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileReader; +import java.io.IOException; +import java.nio.file.Files; + +import org.springframework.stereotype.Component; +import org.springframework.util.ResourceUtils; + +@Component +public class Utils { + + public void readFileclasspath() throws IOException { + File file = ResourceUtils.getFile("classpath:config/sample.txt"); + + // File is found + System.out.println("File Found : " + file.exists()); + + // Read File Content + String content = new String(Files.readAllBytes(file.toPath())); + System.out.println(content); + } + + public String readFromFile(String file) { + String content = ""; + try { + + BufferedReader bufferedReader = new BufferedReader(new FileReader(file)); + content = bufferedReader.readLine(); + String temp; + while ((temp = bufferedReader.readLine()) != null) { + content = content.concat(temp); + } + content = content.trim(); + bufferedReader.close(); + } catch (Exception e) { + content = null; + } + return content; + } + +} diff --git a/tapisimulator/src/main/resources/application.properties b/tapisimulator/src/main/resources/application.properties new file mode 100644 index 0000000..e69de29 diff --git a/tapisimulator/src/main/resources/logback.xml b/tapisimulator/src/main/resources/logback.xml new file mode 100644 index 0000000..10f7ccf --- /dev/null +++ b/tapisimulator/src/main/resources/logback.xml @@ -0,0 +1,28 @@ + + + + logFileName + dcasim + + + + + /var/log/onap/dcasimulator/${logFileName}.log + + ${logFileName}.%i.log.zip + 1 + 5 + + + 5MB + + + %d{dd-MM-yyyy HH:mm:ss.SSS} %magenta([%thread]) %highlight(%-5level) %logger{36}.%M - %msg%n + + + + + + + + diff --git a/tapisimulator/src/test/java/org/onap/tapisimulator/Config.java b/tapisimulator/src/test/java/org/onap/tapisimulator/Config.java new file mode 100644 index 0000000..3ea4d5e --- /dev/null +++ b/tapisimulator/src/test/java/org/onap/tapisimulator/Config.java @@ -0,0 +1,44 @@ +/* + * ============LICENSE_START======================================================= + * TAPI-SIMULATOR + * ================================================================================ + * Copyright (C) 2020 Fujitsu Limited. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.onap.tapisimulator; + +import static org.mockito.Mockito.when; + +import org.mockito.Mockito; +import org.onap.tapisimulator.utils.Utils; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class Config { + + @Bean + public Utils utils() { + Utils utils = Mockito.mock(Utils.class); + String topology = TestUtils.readFileclasspath("tapi-topology.json"); + String sipList = TestUtils.readFileclasspath("siplist.json"); + when(utils.readFromFile("/opt/onap/tapisimulator/templates/tapi1-topology.json")).thenReturn(topology); + when(utils.readFromFile("/opt/onap/tapisimulator/templates/tapi1-siplist.json")).thenReturn(sipList); + + return utils; + } + +} diff --git a/tapisimulator/src/test/java/org/onap/tapisimulator/TestUtils.java b/tapisimulator/src/test/java/org/onap/tapisimulator/TestUtils.java new file mode 100644 index 0000000..102d2b3 --- /dev/null +++ b/tapisimulator/src/test/java/org/onap/tapisimulator/TestUtils.java @@ -0,0 +1,47 @@ +/* + * ============LICENSE_START======================================================= + * TAPI-SIMULATOR + * ================================================================================ + * Copyright (C) 2020 Fujitsu Limited. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.onap.tapisimulator; + +import java.io.IOException; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; + +import org.springframework.core.io.ClassPathResource; +import org.springframework.core.io.Resource; +import org.springframework.util.FileCopyUtils; + +public class TestUtils { + + public static String readFileclasspath(String filename) { + String data = ""; + Resource resource = new ClassPathResource(filename); + InputStream inputStream; + try { + inputStream = resource.getInputStream(); + byte[] bdata = FileCopyUtils.copyToByteArray(inputStream); + data = new String(bdata, StandardCharsets.UTF_8); + return data; + } catch (IOException e) { + return data; + } + } + +} diff --git a/tapisimulator/src/test/java/org/onap/tapisimulator/controller/TestTapiController.java b/tapisimulator/src/test/java/org/onap/tapisimulator/controller/TestTapiController.java new file mode 100644 index 0000000..9b4c2f3 --- /dev/null +++ b/tapisimulator/src/test/java/org/onap/tapisimulator/controller/TestTapiController.java @@ -0,0 +1,103 @@ +/* + * ============LICENSE_START======================================================= + * TAPI-SIMULATOR + * ================================================================================ + * Copyright (C) 2020 Fujitsu Limited. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.onap.tapisimulator.controller; + +import static org.junit.Assert.assertEquals; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.MockitoAnnotations; +import org.onap.tapisimulator.Application; +import org.onap.tapisimulator.Config; +import org.onap.tapisimulator.TestUtils; +import org.onap.tapisimulator.service.TapiService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.web.client.TestRestTemplate; +import org.springframework.boot.web.server.LocalServerPort; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@SpringBootTest( + properties = "spring.main.allow-bean-definition-overriding=true", + classes = {Application.class, Config.class}, + webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) +public class TestTapiController { + @LocalServerPort + private int port; + + @Autowired + TapiService tapiService; + + @Autowired + TestRestTemplate restTemplate; + + @Before + public void beforeEach() { + + MockitoAnnotations.initMocks(this); + } + + @Test + public void testTopology() throws Exception { + String topology = TestUtils.readFileclasspath("tapi-topology.json"); + String uri = "http://localhost:" + port + "/cxf/tapi/v2/connectivities/topology"; + ResponseEntity response = this.restTemplate.getForEntity(uri, String.class); + + HttpStatus status = response.getStatusCode(); + assertEquals(status, HttpStatus.OK); + String content = response.getBody(); + assertEquals(content, topology); + } + + @Test + public void testServiceCreateTapi() throws Exception { + String serviceCreaterequest = TestUtils.readFileclasspath("service-create-tapi.json"); + String expectedResponse = "Service created Successfully"; + String name = "test"; + String uri = "http://localhost:" + port + "/cxf/tapi/v2/connectivities/create-service/" + name; + ResponseEntity response = this.restTemplate.postForEntity(uri, serviceCreaterequest, String.class); + HttpStatus status = response.getStatusCode(); + assertEquals(HttpStatus.OK, status); + String content = response.getBody(); + assertEquals(content, expectedResponse); + } + + @Test + public void deleteTapiServiceTest() { + String expectedResponse = "Service deleted successfully"; + String name = "test"; + String uri = "http://localhost:" + port + "/cxf/tapi/v2/connectivities/delete-service/" + name; + HttpEntity entity = new HttpEntity<>(""); + ResponseEntity response = this.restTemplate.exchange(uri, HttpMethod.DELETE, entity, String.class); + HttpStatus status = response.getStatusCode(); + assertEquals(HttpStatus.OK, status); + String content = response.getBody(); + assertEquals(content, expectedResponse); + + } + +} diff --git a/tapisimulator/src/test/resources/service-create-tapi.json b/tapisimulator/src/test/resources/service-create-tapi.json new file mode 100644 index 0000000..ec03cef --- /dev/null +++ b/tapisimulator/src/test/resources/service-create-tapi.json @@ -0,0 +1,54 @@ +{ + "create-connectivity-service-input-list": [ + { + "end-point": [ + { + "local-id": "/OTN/Node2-456/ODU2:1-1-1", + "layer-protocol-name": "ODU", + "connection-end-point": [ + { + "topology-uuid": "754a91dc-dcd1-3530-8e95-a4880c298a1f", + "node-edge-point-uuid": "456789", + "node-uuid": "Node2-456", + "connection-end-point-uuid": "efghi" + } + ], + "service-interface-point": { + "service-interface-point-uuid": "efghi" + }, + "protection-role": "WORK" + }, + { + "local-id": "/OTN/Node1-123/ODU2:1-1-1", + "layer-protocol-name": "ODU", + "connection-end-point": [ + { + "topology-uuid": "754a91dc-dcd1-3530-8e95-a4880c298a1f", + "node-edge-point-uuid": "123456", + "node-uuid": "Node1-123", + "connection-end-point-uuid": "abcde" + } + ], + "service-interface-point": { + "service-interface-point-uuid": "abcde" + }, + "protection-role": "WORK" + } + ], + "layer-protocol-name": "ODU", + "connectivity-constraint": { + "service-type": "POINT_TO_POINT_CONNECTIVITY" + }, + "routing-constraint": { + "route-objective-function": "MIN_WORK_ROUTE_COST" + }, + "topology-constraint": [], + "name": [ + { + "value-name": "service-name", + "value": "test" + } + ] + } + ] +} diff --git a/tapisimulator/src/test/resources/siplist.json b/tapisimulator/src/test/resources/siplist.json new file mode 100644 index 0000000..dc5d673 --- /dev/null +++ b/tapisimulator/src/test/resources/siplist.json @@ -0,0 +1,52 @@ +{ + "sip": [ + { + "layer-protocol-name": "ODU", + "uuid": "abcde", + "administrative-state": "UNLOCKED", + "lifecycle-state": "INSTALLED", + "name": [ + { + "value-name": "tid", + "value": "Node1" + }, + { + "value-name": "name", + "value": "1-1-1" + }, + { + "value-name": "rate", + "value": "ODU2" + }, + { + "value-name": "direction", + "value": "BI" + } + ] + }, + { + "layer-protocol-name": "ODU", + "uuid": "efghi", + "administrative-state": "UNLOCKED", + "lifecycle-state": "INSTALLED", + "name": [ + { + "value-name": "tid", + "value": "Node2" + }, + { + "value-name": "name", + "value": "1-1-1" + }, + { + "value-name": "rate", + "value": "ODU2" + }, + { + "value-name": "direction", + "value": "BI" + } + ] + } + ] +} diff --git a/tapisimulator/src/test/resources/tapi-topology.json b/tapisimulator/src/test/resources/tapi-topology.json new file mode 100644 index 0000000..f4278dc --- /dev/null +++ b/tapisimulator/src/test/resources/tapi-topology.json @@ -0,0 +1,135 @@ +{ + "topology": [ + { + "uuid": "754a91dc-dcd1-3530-8e95-a4880c298a1f", + "link": [], + "layer-protocol-name": [], + "node": [ + { + "encap-topology": { + "topology-uuid": "754a91dc-dcd1-3530-8e95-a4880c298a1f" + }, + "uuid": "Node1-123", + "node-edge-point": [ + { + "tapi-connectivity:cep-list": { + "connection-end-point": [ + { + "uuid": "abcde", + "name": [ + { + "value-name": "name", + "value": "1-1-1" + }, + { + "value-name": "direction", + "value": "BI" + } + ] + } + ] + }, + "link-port-direction": "BIDIRECTIONAL", + "layer-protocol-name": "ODU", + "uuid": "123456", + "administrative-state": "UNLOCKED", + "lifecycle-state": "INSTALLED", + "name": [ + { + "value-name": "tid", + "value": "Node1" + }, + { + "value-name": "name", + "value": "1-1-1" + }, + { + "value-name": "rate", + "value": "10GE" + }, + { + "value-name": "direction", + "value": "BI" + } + ] + } + ], + "layer-protocol-name": [ + "ODU" + ], + "name": [ + { + "value-name": "name", + "value": "Node1" + } + ] + }, + { + "encap-topology": { + "topology-uuid": "754a91dc-dcd1-3530-8e95-a4880c298a1f" + }, + "uuid": "Node2-456", + "node-edge-point": [ + { + "tapi-connectivity:cep-list": { + "connection-end-point": [ + { + "uuid": "efghi", + "name": [ + { + "value-name": "name", + "value": "1-1-1" + }, + { + "value-name": "direction", + "value": "BI" + } + ] + } + ] + }, + "link-port-direction": "BIDIRECTIONAL", + "layer-protocol-name": "ODU", + "uuid": "456789", + "administrative-state": "UNLOCKED", + "lifecycle-state": "INSTALLED", + "name": [ + { + "value-name": "tid", + "value": "Node2" + }, + { + "value-name": "name", + "value": "1-1-1" + }, + { + "value-name": "rate", + "value": "10GE" + }, + { + "value-name": "direction", + "value": "BI" + } + ] + } + ], + "layer-protocol-name": [ + "ODU" + ], + "name": [ + { + "value-name": "name", + "value": "Node2" + } + ] + } + ], + "name": [ + { + "value-name": "name", + "value": "OTN" + } + ] + } + ] +} -- cgit 1.2.3-korg