aboutsummaryrefslogtreecommitdiffstats
path: root/msasimulator/src/test
diff options
context:
space:
mode:
Diffstat (limited to 'msasimulator/src/test')
-rw-r--r--msasimulator/src/test/java/org/onap/msasimulator/Config.java62
-rw-r--r--msasimulator/src/test/java/org/onap/msasimulator/TestUtils.java47
-rw-r--r--msasimulator/src/test/java/org/onap/msasimulator/controller/TestMsaController.java110
-rw-r--r--msasimulator/src/test/java/org/onap/msasimulator/service/MsaServiceTest.java113
-rw-r--r--msasimulator/src/test/resources/service-create-failure.json54
-rw-r--r--msasimulator/src/test/resources/service-create-success.json54
-rw-r--r--msasimulator/src/test/resources/service-delete-request.json12
-rw-r--r--msasimulator/src/test/resources/topology.json130
8 files changed, 582 insertions, 0 deletions
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
+ }
+ }
+ ]
+}